Преглед на файлове

Merge remote-tracking branch 'origin/master'

Makumbacz преди 3 години
родител
ревизия
62e02f9e3f

+ 5 - 0
pom.xml

@@ -67,6 +67,11 @@
             <artifactId>java-jwt</artifactId>
             <version>3.19.1</version>
         </dependency>
+        <dependency>
+            <groupId>com.google.api-client</groupId>
+            <artifactId>google-api-client</artifactId>
+            <version>1.34.1</version>
+        </dependency>
     </dependencies>
 
     <build>

+ 3 - 3
src/main/java/com/example/plantsforyou/PlantsForYouApplication.java

@@ -35,11 +35,11 @@ public class PlantsForYouApplication {
     @Bean
     public JavaMailSender getJavaMailSender() {
         JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
-        mailSender.setHost("smtp-relay.sendinblue.com");
+        mailSender.setHost("smtp.gmail.com");
         mailSender.setPort(587);
 
-        mailSender.setUsername("blazemakul@gmail.com");
-        mailSender.setPassword("PGyj0SJhY4TO9pBc");
+        mailSender.setUsername(System.getenv().get("SMTP_USERNAME"));
+        mailSender.setPassword(System.getenv().get("SMTP_PASSWORD"));
 
         Properties props = mailSender.getJavaMailProperties();
         props.put("mail.transport.protocol", "smtp");

+ 14 - 0
src/main/java/com/example/plantsforyou/appuser/AppUser.java

@@ -40,6 +40,7 @@ public class AppUser implements UserDetails {
     private AppUserRole appUserRole;
     private Boolean locked = false;
     private Boolean enabled = false;
+    private Boolean oAuth = false;
 
 
     public AppUser(String firstName,
@@ -55,6 +56,19 @@ public class AppUser implements UserDetails {
 
     }
 
+    public AppUser(String firstName,
+                   String lastName,
+                   String email,
+                   AppUserRole appUserRole) {
+        this.firstName = firstName;
+        this.lastName = lastName;
+        this.email = email;
+        this.appUserRole = appUserRole;
+        this.oAuth = true;
+        this.password = "none";
+        this.enabled = true;
+    }
+
     @Override
     public Collection<? extends GrantedAuthority> getAuthorities() {
         SimpleGrantedAuthority authority =

+ 2 - 1
src/main/java/com/example/plantsforyou/appuser/LoginCredentials.java

@@ -10,12 +10,13 @@ import lombok.NoArgsConstructor;
 public class LoginCredentials {
     private String username;
     private String password;
+    private String oauth;
 
     public String getUsername() {
         return username;
     }
-
     public String getPassword() {
         return password;
     }
+    public String getOAuth() { return oauth;  }
 }

+ 42 - 4
src/main/java/com/example/plantsforyou/filter/CustomAuthenticationFilter.java

@@ -4,26 +4,37 @@ import com.auth0.jwt.JWT;
 import com.auth0.jwt.algorithms.Algorithm;
 import com.example.plantsforyou.appuser.AppUser;
 import com.example.plantsforyou.appuser.LoginCredentials;
+import com.example.plantsforyou.oAuth.oAuthService;
+import com.example.plantsforyou.registration.RegistrationService;
 import com.fasterxml.jackson.databind.ObjectMapper;
-import lombok.NoArgsConstructor;
+import com.google.api.client.googleapis.auth.oauth2.GoogleIdToken;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Configurable;
 import org.springframework.security.authentication.AuthenticationManager;
 import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
 import org.springframework.security.core.Authentication;
 import org.springframework.security.core.AuthenticationException;
 import org.springframework.security.core.GrantedAuthority;
+import org.springframework.security.core.userdetails.UserDetails;
+import org.springframework.security.core.userdetails.UsernameNotFoundException;
 import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
-import org.springframework.web.bind.annotation.CrossOrigin;
+import org.springframework.stereotype.Component;
+import org.springframework.web.context.WebApplicationContext;
+import org.springframework.web.context.support.SpringBeanAutowiringSupport;
+import org.springframework.web.context.support.WebApplicationContextUtils;
 
 import javax.servlet.FilterChain;
-import javax.servlet.ServletException;
+import javax.servlet.ServletContext;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import java.io.BufferedReader;
 import java.io.IOException;
+import java.security.GeneralSecurityException;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.Map;
+import java.util.Optional;
 import java.util.stream.Collectors;
 
 import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE;
@@ -33,6 +44,8 @@ public class CustomAuthenticationFilter extends UsernamePasswordAuthenticationFi
     private final AuthenticationManager authenticationManager;
     private final ObjectMapper objectMapper = new ObjectMapper();
 
+    private oAuthService authService;
+
     public CustomAuthenticationFilter(AuthenticationManager authenticationManager){
         this.authenticationManager = authenticationManager;
     }
@@ -40,6 +53,11 @@ public class CustomAuthenticationFilter extends UsernamePasswordAuthenticationFi
     @Override
     public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) {
         log.info("New login request!");
+        if(authService == null){
+            ServletContext servletContext = request.getServletContext();
+            WebApplicationContext webApplicationContext = WebApplicationContextUtils.getWebApplicationContext(servletContext);
+            authService = webApplicationContext.getBean(oAuthService.class);
+        }
         try {
             BufferedReader reader = request.getReader();
             StringBuilder stringBuilder = new StringBuilder();
@@ -51,9 +69,26 @@ public class CustomAuthenticationFilter extends UsernamePasswordAuthenticationFi
 
             String email = credentials.getUsername();
             String password = credentials.getPassword();
+            String oAuth = credentials.getOAuth();
             log.info("Email is: {}", email);
             log.info("Password is: {}", password);
-            UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(email, password);
+            UsernamePasswordAuthenticationToken authenticationToken = null;
+            if(oAuth.equals("true")){
+                GoogleIdToken idToken = authService.validate(password);
+                if(idToken != null) {
+                    GoogleIdToken.Payload payload =  idToken.getPayload();
+                    String payloadEmail = payload.getEmail();
+                    String payloadName = (String) payload.get("name");
+                    if(!authService.findByEmail(payloadEmail).isPresent()){
+                        authService.singUpUser(payload);
+                    }
+                    AppUser user = authService.findByEmail(payloadEmail).get();
+                    authenticationToken = new UsernamePasswordAuthenticationToken(user.getUsername(), "none");
+                }
+            }
+            else{
+                authenticationToken = new UsernamePasswordAuthenticationToken(email, password);
+            }
             return authenticationManager.authenticate(authenticationToken);
         }
         catch (AuthenticationException e){
@@ -61,7 +96,10 @@ public class CustomAuthenticationFilter extends UsernamePasswordAuthenticationFi
             throw new IllegalStateException(e.getMessage());
         }
         catch(IOException e){
+            log.error(e.getMessage());
             throw new IllegalArgumentException(e.getMessage());
+        } catch (GeneralSecurityException e) {
+            throw new IllegalStateException(e.getMessage());
         }
     }
 

+ 54 - 0
src/main/java/com/example/plantsforyou/oAuth/oAuthService.java

@@ -0,0 +1,54 @@
+package com.example.plantsforyou.oAuth;
+
+import com.example.plantsforyou.appuser.AppUser;
+import com.example.plantsforyou.appuser.AppUserRepository;
+import com.example.plantsforyou.appuser.AppUserRole;
+import com.example.plantsforyou.filter.CustomAuthenticationFilter;
+import com.example.plantsforyou.appuser.AppUserService;
+import com.google.api.client.googleapis.auth.oauth2.GoogleIdToken;
+import com.google.api.client.googleapis.auth.oauth2.GoogleIdTokenVerifier;
+import com.google.api.client.http.HttpTransport;
+import com.google.api.client.http.javanet.NetHttpTransport;
+import com.google.api.client.json.JsonFactory;
+import com.google.api.client.json.gson.GsonFactory;
+import lombok.AllArgsConstructor;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.security.core.userdetails.UserDetails;
+import org.springframework.stereotype.Component;
+import org.springframework.stereotype.Service;
+
+import javax.servlet.http.HttpServletRequest;
+import java.io.IOException;
+import java.security.GeneralSecurityException;
+import java.util.Collections;
+import java.util.Optional;
+
+@Service
+public class oAuthService {
+    private AppUserService userService;
+
+    @Autowired
+    private void setUserService(AppUserService userService){
+        this.userService = userService;
+    }
+
+    public GoogleIdToken validate(String token) throws GeneralSecurityException, IOException {
+        try {
+            GoogleIdTokenVerifier verifier = new GoogleIdTokenVerifier.Builder(new NetHttpTransport(), new GsonFactory())
+                    .setAudience(Collections.singletonList("676799456601-hu3k0k4ko7h7s52t8p7quk7kqho87umb.apps.googleusercontent.com"))
+                    .build();
+            return verifier.verify(token);
+        }
+        catch (GeneralSecurityException | IOException e){
+            return null;
+        }
+    }
+    public Optional<AppUser> findByEmail(String email){ return Optional.ofNullable(userService.getAppUser(email)); }
+
+    public void singUpUser(GoogleIdToken.Payload payload){
+        AppUser user = new AppUser((String) payload.get("name"), (String) payload.get("family_name"), payload.getEmail(), AppUserRole.USER);
+        userService.signUpUser(user);
+    }
+}

+ 13 - 0
src/main/java/com/example/plantsforyou/plant/Plant.java

@@ -24,6 +24,7 @@ public class Plant {
     private String name;
     private double price;
     private int quantity;
+    private String imgURL;
     @Column(columnDefinition="TEXT")
     private String description;
     @Enumerated(EnumType.STRING)
@@ -51,6 +52,18 @@ public class Plant {
         this.inStock = inStock;
     }
 
+    public Plant(String name, double price, int quantity, String imgURL, String description, PlantTypeOfLight typeOfLight, PlantCareDifficulty difficulty, PlantSize size, boolean inStock) {
+        this.name = name;
+        this.price = price;
+        this.quantity = quantity;
+        this.imgURL = imgURL;
+        this.description = description;
+        this.typeOfLight = typeOfLight;
+        this.difficulty = difficulty;
+        this.size = size;
+        this.inStock = inStock;
+    }
+
     public void setPrice(double price) {
         this.price = price;
     }

+ 58 - 8
src/main/java/com/example/plantsforyou/plant/PlantConfig.java

@@ -15,8 +15,9 @@ public class PlantConfig {
         return args -> {
             Plant plant = new Plant(
                     "Monstera deliciosa",
-                    25.12,
+                    88,
                     3,
+                    "https://cdn.shopify.com/s/files/1/0150/6262/products/the-sill_monstera_variant_medium_grant_mint_0d014032-0bb0-4dd6-865e-f0f8a31f98c4.jpg?v=1650482391",
                     "Najbardziej pożądana roślina we wnętrzach ostatnich lat, czule nazwana przez nas Grzegorzem, zawdzięcza swoją popularność nie tylko wyjątkowej urodzie, ale też swojej bezproblemowości. Monstera jest jedną z tych roślin, z którymi będziesz żyć długo i szczęśliwie.",
                     PlantTypeOfLight.diffused,
                     PlantCareDifficulty.EASY,
@@ -25,14 +26,63 @@ public class PlantConfig {
             );
             repository.save(plant);
             plant = new Plant(
-                    "Scindapsus pictus 'Argyraeus'",
-                    59.0,
-                    4,
-                    "Nie ma wielkich wymagań i zdecydowanie nadaje się dla początkujących opiekunów. Z Agatką łatwo stworzysz wrażenie gęstej dżungli. Wystarczy, że spuścisz jej pnącza kurtyną z wysokiej półki, albo belki pod sufitem.",
-                    PlantTypeOfLight.direct,
+                    "Kawowiec",
+                    46,
+                    3,
+                    "https://cdn.shopify.com/s/files/1/0150/6262/products/the-sill_monstera_variant_medium_grant_mint_0d014032-0bb0-4dd6-865e-f0f8a31f98c4.jpg?v=1650482391",
+                    "Być może zaskoczy Cię fakt, że ta sama roślina, która uprawia ziarna porannej kawy, jest popularną i łatwą w utrzymaniu rośliną domową!",
+                    PlantTypeOfLight.shadow,
+                    PlantCareDifficulty.EASY,
+                    PlantSize.SMALL,
+                    true
+            );
+            repository.save(plant);
+            plant = new Plant(
+                    "Anturium Andrego",
+                    59,
+                    3,
+                    "https://cdn.shopify.com/s/files/1/0150/6262/products/the-sill_red-anthurium_small_kent_white.jpg?v=1652382922",
+                    "Znane także jako kwiat flaminga, Anthurium jest najdłużej kwitnącą rośliną domową na świecie. Rzadko można spotkać ją bez efektownych kwiatów.",
+                    PlantTypeOfLight.shadow,
+                    PlantCareDifficulty.EASY,
+                    PlantSize.SMALL,
+                    true
+            );
+            repository.save(plant);
+            plant = new Plant(
+                    "Dracaena trifasciata",
+                    160,
+                    5,
+                    "https://cdn.shopify.com/s/files/1/0150/6262/products/the-sill_snake-plant-laurentii_large_burbank_white.jpg?v=1650310323",
+                    "Sansewieria gwinejska to sukulent charakteryzujący się liśćmi przypominającymi miecz o intensywnie żółtych brzegach. Jest popularna ze względu na swój łagodny charakter - toleruje suszę i słabe oświetlenie - oraz zdolność oczyszczania powietrza. ",
+                    PlantTypeOfLight.diffused,
+                    PlantCareDifficulty.EASY,
+                    PlantSize.BIG,
+                    true
+            );
+            repository.save(plant);
+            plant = new Plant(
+                    "Zamioculcas zamiifolia",
+                    165,
+                    5,
+                    "https://cdn.shopify.com/s/files/1/0150/6262/products/the-sill_zz-plant_large_burbank_white.jpg?v=1649186086",
+                    "Roślina 'ZZ' charakteryzuje się zielonymi, woskowymi liśćmi nad powierzchnią mieszanki doniczkowej i dużymi, podobnymi do ziemniaków kłączami pod spodem. Kłącza magazynują wodę, dzięki czemu 'ZZ' jest rośliną odporną na suszę, która może tygodniami obywać się bez wody.",
+                    PlantTypeOfLight.diffused,
+                    PlantCareDifficulty.EASY,
+                    PlantSize.BIG,
+                    true
+            );
+            repository.save(plant);
+            plant = new Plant(
+                    "Peperomia Raindrop",
+                    80,
+                    3,
+                    "https://cdn.shopify.com/s/files/1/0150/6262/products/the-sill_peperomia-raindrop_small_upcycled-planter-saucer_stonewash.jpg?v=1651001147",
+                    "Peperomie stają się coraz popularniejsze w uprawie domowej ze względu na swoją dużą odporność na okresowe przesuszenie oraz oczywiście niebanalną urodę. Odmiana 'Raindrop' cechuje się dużymi liśćmi o żywej, ciemnej zieleni oraz ciekawym kształcie. Zaokrąglone blaszki liściowe mają z jednej strony ostre zakończenie nadające im formę łezki lub spadającej kropli wody -stąd nazwa odmiany 'Raindrop'. ",
+                    PlantTypeOfLight.diffused,
                     PlantCareDifficulty.MEDIUM,
-                    PlantSize.MEDIUM,
-                    false
+                    PlantSize.SMALL,
+                    true
             );
             repository.save(plant);
         };

+ 3 - 3
src/main/resources/application.properties

@@ -1,6 +1,6 @@
-spring.datasource.url=jdbc:postgresql://localhost:5432/plantsforyou
-spring.datasource.username=postgres
-spring.datasource.password=1234
+spring.datasource.url=jdbc:${DATABASE_URL}
+spring.datasource.username=${DATABASE_USERNAME}
+spring.datasource.password=${DATABASE_PASSWORD}
 spring.jpa.hibernate.ddl-auto=create-drop
 spring.jpa.show-sql=true
 spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect