// Path: src/main/java/se/omegapoint/facepalm/domain/User.java
// public class User {
//     public final String username;
//     public final String email;
//     public final String firstname;
//     public final String lastname;
// 
//     /*
//         Is there a better way than just using strings I wonder?
//      */
//     public User(final String username, final String email, final String firstname, final String lastname) {
//         this.username = notBlank(username);
//         this.email = notBlank(email);
//         this.firstname = notBlank(firstname);
//         this.lastname = notBlank(lastname);
//     }
// 
//     @Override
//     public boolean equals(final Object o) {
//         if (this == o) return true;
//         if (o == null || getClass() != o.getClass()) return false;
//         final User user = (User) o;
//         return Objects.equals(username, user.username) &&
//                 Objects.equals(email, user.email) &&
//                 Objects.equals(firstname, user.firstname) &&
//                 Objects.equals(lastname, user.lastname);
//     }
// 
//     @Override
//     public int hashCode() {
//         return Objects.hash(username, email, firstname, lastname);
//     }
// 
//     @Override
//     public String toString() {
//         return "User{" +
//                 "username='" + username + '\'' +
//                 ", email='" + email + '\'' +
//                 ", firstname='" + firstname + '\'' +
//                 ", lastname='" + lastname + '\'' +
//                 '}';
//     }
// }
// 
// Path: src/main/java/se/omegapoint/facepalm/domain/repository/UserRepository.java
// public interface UserRepository {
//     Optional<User> findByUsername(final String username);
// 
//     Set<User> findFriendsFor(String username);
// 
//     Optional<User> findByNameAndPassword(final String username, final String password);
// 
//     List<User> findLike(String value);
// 
//     void addFriend(String user, String friend);
// 
//     void addUser(NewUserCredentials credentials);
// 
//     boolean usersAreFriends(String userA, String userB);
// }


import org.springframework.security.authentication.AuthenticationProvider;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.AuthenticationException;
import se.omegapoint.facepalm.domain.User;
import se.omegapoint.facepalm.domain.repository.UserRepository;
import java.util.Optional;
import static java.util.Collections.emptyList;
import static org.apache.commons.lang3.Validate.notNull;
/*
 * Copyright 2016 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package se.omegapoint.facepalm.client.security;




public class DbAuthenticationProvider implements AuthenticationProvider {

    private final UserRepository userRepository;

    public DbAuthenticationProvider(final UserRepository userRepository) {
        this.userRepository = notNull(userRepository);
    }

    @Override
    public Authentication authenticate(final Authentication authentication) throws AuthenticationException {
        final UsernamePasswordAuthenticationToken token = (UsernamePasswordAuthenticationToken) authentication;
        final String username = (String) token.getPrincipal();
        final String password = (String) token.getCredentials();

// Path: src/main/java/se/omegapoint/facepalm/domain/User.java
// public class User {
//     public final String username;
//     public final String email;
//     public final String firstname;
//     public final String lastname;
// 
//     /*
//         Is there a better way than just using strings I wonder?
//      */
//     public User(final String username, final String email, final String firstname, final String lastname) {
//         this.username = notBlank(username);
//         this.email = notBlank(email);
//         this.firstname = notBlank(firstname);
//         this.lastname = notBlank(lastname);
//     }
// 
//     @Override
//     public boolean equals(final Object o) {
//         if (this == o) return true;
//         if (o == null || getClass() != o.getClass()) return false;
//         final User user = (User) o;
//         return Objects.equals(username, user.username) &&
//                 Objects.equals(email, user.email) &&
//                 Objects.equals(firstname, user.firstname) &&
//                 Objects.equals(lastname, user.lastname);
//     }
// 
//     @Override
//     public int hashCode() {
//         return Objects.hash(username, email, firstname, lastname);
//     }
// 
//     @Override
//     public String toString() {
//         return "User{" +
//                 "username='" + username + '\'' +
//                 ", email='" + email + '\'' +
//                 ", firstname='" + firstname + '\'' +
//                 ", lastname='" + lastname + '\'' +
//                 '}';
//     }
// }
// 
// Path: src/main/java/se/omegapoint/facepalm/domain/repository/UserRepository.java
// public interface UserRepository {
//     Optional<User> findByUsername(final String username);
// 
//     Set<User> findFriendsFor(String username);
// 
//     Optional<User> findByNameAndPassword(final String username, final String password);
// 
//     List<User> findLike(String value);
// 
//     void addFriend(String user, String friend);
// 
//     void addUser(NewUserCredentials credentials);
// 
//     boolean usersAreFriends(String userA, String userB);
// }


// Path: src/main/java/se/omegapoint/facepalm/client/security/DbAuthenticationProvider.java
import org.springframework.security.authentication.AuthenticationProvider;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.AuthenticationException;
import se.omegapoint.facepalm.domain.User;
import se.omegapoint.facepalm.domain.repository.UserRepository;
import java.util.Optional;
import static java.util.Collections.emptyList;
import static org.apache.commons.lang3.Validate.notNull;

/*
 * Copyright 2016 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package se.omegapoint.facepalm.client.security;




public class DbAuthenticationProvider implements AuthenticationProvider {

    private final UserRepository userRepository;

    public DbAuthenticationProvider(final UserRepository userRepository) {
        this.userRepository = notNull(userRepository);
    }

    @Override
    public Authentication authenticate(final Authentication authentication) throws AuthenticationException {
        final UsernamePasswordAuthenticationToken token = (UsernamePasswordAuthenticationToken) authentication;
        final String username = (String) token.getPrincipal();
        final String password = (String) token.getCredentials();

        final Optional<User> user = userRepository.findByNameAndPassword(username, password);