|
|
|
@ -3,6 +3,7 @@ package studycave.studycaverestservice.usos;
|
|
|
|
|
|
|
|
|
|
import io.restassured.response.Response;
|
|
|
|
|
import org.apache.commons.codec.binary.Base64;
|
|
|
|
|
import org.apache.commons.text.RandomStringGenerator;
|
|
|
|
|
import org.apache.http.HttpResponse;
|
|
|
|
|
import org.apache.http.NameValuePair;
|
|
|
|
|
import org.apache.http.client.HttpClient;
|
|
|
|
@ -11,11 +12,16 @@ import org.apache.http.client.utils.URLEncodedUtils;
|
|
|
|
|
import org.apache.http.entity.StringEntity;
|
|
|
|
|
import org.apache.http.impl.client.HttpClientBuilder;
|
|
|
|
|
import org.apache.http.message.BasicNameValuePair;
|
|
|
|
|
import org.json.JSONArray;
|
|
|
|
|
import org.json.JSONObject;
|
|
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
|
|
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
|
|
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
import studycave.studycaverestservice.PropertiesLoader;
|
|
|
|
|
import studycave.studycaverestservice.model.studyGroup.GroupRepository;
|
|
|
|
|
import studycave.studycaverestservice.model.studyGroup.StudyGroup;
|
|
|
|
|
import studycave.studycaverestservice.model.studyGroupMember.StudyGroupMember;
|
|
|
|
|
import studycave.studycaverestservice.model.studyGroupMember.StudyGroupMemberRepository;
|
|
|
|
|
import studycave.studycaverestservice.model.user.User;
|
|
|
|
|
import studycave.studycaverestservice.model.user.UserRepository;
|
|
|
|
|
import studycave.studycaverestservice.model.user.UsosUser;
|
|
|
|
@ -29,12 +35,14 @@ import java.io.UnsupportedEncodingException;
|
|
|
|
|
import java.net.URLEncoder;
|
|
|
|
|
import java.security.InvalidKeyException;
|
|
|
|
|
import java.security.NoSuchAlgorithmException;
|
|
|
|
|
import java.text.ParseException;
|
|
|
|
|
import java.text.SimpleDateFormat;
|
|
|
|
|
import java.util.ArrayList;
|
|
|
|
|
import java.util.Date;
|
|
|
|
|
import java.util.List;
|
|
|
|
|
import java.util.Optional;
|
|
|
|
|
|
|
|
|
|
import static io.restassured.RestAssured.get;
|
|
|
|
|
import static io.restassured.RestAssured.when;
|
|
|
|
|
import static io.restassured.RestAssured.*;
|
|
|
|
|
import static studycave.studycaverestservice.utils.PasswordGenerator.*;
|
|
|
|
|
|
|
|
|
|
@Service
|
|
|
|
@ -56,6 +64,12 @@ public class AuthorizationService {
|
|
|
|
|
@Autowired
|
|
|
|
|
private UserRepository userRepository;
|
|
|
|
|
|
|
|
|
|
@Autowired
|
|
|
|
|
private GroupRepository groupRepository;
|
|
|
|
|
|
|
|
|
|
@Autowired
|
|
|
|
|
private StudyGroupMemberRepository studyGroupMemberRepository;
|
|
|
|
|
|
|
|
|
|
public TokenResponseDTO authorize(String oauth_token, String oauth_token_secret, String oauth_verifier) throws IOException, InvalidKeyException, NoSuchAlgorithmException {
|
|
|
|
|
List<NameValuePair> queryParams = new ArrayList<>();
|
|
|
|
|
queryParams.add(new BasicNameValuePair("oauth_consumer_key", propertiesLoader.getKey()));
|
|
|
|
@ -74,28 +88,165 @@ public class AuthorizationService {
|
|
|
|
|
oauth_token = tokens[0].replace("oauth_token=", "");
|
|
|
|
|
oauth_token_secret = tokens[1].replace("oauth_token_secret=", "");
|
|
|
|
|
TokenResponseDTO tokenResponseDTO = createUserAccountAndReturnHeaderToken(oauth_token, oauth_token_secret);
|
|
|
|
|
updateUserGroupsAndStudents(oauth_token, oauth_token_secret);
|
|
|
|
|
String finalOauth_token = oauth_token;
|
|
|
|
|
String finalOauth_token_secret = oauth_token_secret;
|
|
|
|
|
Thread thread = new Thread(() -> {
|
|
|
|
|
try {
|
|
|
|
|
if (checkIfEmploye(finalOauth_token, finalOauth_token_secret, tokenResponseDTO.getUserId()))
|
|
|
|
|
updateUserGroupsAndStudents(finalOauth_token, finalOauth_token_secret, tokenResponseDTO.getUserId());
|
|
|
|
|
} catch (UnsupportedEncodingException | InvalidKeyException | NoSuchAlgorithmException e) {
|
|
|
|
|
e.printStackTrace();
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
thread.start();
|
|
|
|
|
//logOut(oauth_token, oauth_token_secret);
|
|
|
|
|
return tokenResponseDTO;
|
|
|
|
|
}
|
|
|
|
|
return new TokenResponseDTO("authorization failed", null);
|
|
|
|
|
return new TokenResponseDTO("authorization failed", null, null);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void updateUserGroupsAndStudents(String oauth_token, String oauth_token_secret) throws UnsupportedEncodingException, InvalidKeyException, NoSuchAlgorithmException {
|
|
|
|
|
private boolean checkIfEmploye(String oauth_token, String oauth_token_secret, String userId) throws UnsupportedEncodingException, InvalidKeyException, NoSuchAlgorithmException {
|
|
|
|
|
List<NameValuePair> queryParams = new ArrayList<>();
|
|
|
|
|
queryParams.add(new BasicNameValuePair("fields", "lecturers"));
|
|
|
|
|
queryParams.add(new BasicNameValuePair("oauth_consumer_key", propertiesLoader.getKey()));
|
|
|
|
|
queryParams.add(new BasicNameValuePair("oauth_nonce", "" + (int) (Math.random() * 100000000)));
|
|
|
|
|
queryParams.add(new BasicNameValuePair("oauth_signature_method", "HMAC-SHA1"));
|
|
|
|
|
queryParams.add(new BasicNameValuePair("oauth_timestamp", "" + (System.currentTimeMillis() / 1000)));
|
|
|
|
|
queryParams.add(new BasicNameValuePair("oauth_token", oauth_token));
|
|
|
|
|
queryParams.add(new BasicNameValuePair("oauth_version", "1.0"));
|
|
|
|
|
String oauth_signature = getSignature("GET", URLEncoder.encode(propertiesLoader.getUsosApiURL() + "/groups/user", ENC), URLEncoder.encode(URLEncodedUtils.format(queryParams, ENC), ENC), oauth_token_secret);
|
|
|
|
|
queryParams.add(new BasicNameValuePair("oauth_signature", oauth_signature));
|
|
|
|
|
String url = "/groups/user?" + URLEncodedUtils.format(queryParams, ENC);
|
|
|
|
|
queryParams.add(new BasicNameValuePair("user_id", userId));
|
|
|
|
|
String oauth_signature = getSignature("GET", URLEncoder.encode(propertiesLoader.getUsosApiURL() + "/users/employment_positions", ENC), URLEncoder.encode(URLEncodedUtils.format(queryParams, ENC), ENC), oauth_token_secret);
|
|
|
|
|
|
|
|
|
|
String courses = when().get(url).body().asString();
|
|
|
|
|
System.out.println(courses);
|
|
|
|
|
queryParams.add(new BasicNameValuePair("oauth_signature", oauth_signature));
|
|
|
|
|
String url = "/users/employment_positions?" + URLEncodedUtils.format(queryParams, ENC);
|
|
|
|
|
|
|
|
|
|
Response response = get(url);
|
|
|
|
|
JSONArray responseJSON = new JSONArray(response.getBody().print());
|
|
|
|
|
return responseJSON.length() > 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void updateUserGroupsAndStudents(String oauth_token, String oauth_token_secret, String userId) throws UnsupportedEncodingException, InvalidKeyException, NoSuchAlgorithmException {
|
|
|
|
|
|
|
|
|
|
RandomStringGenerator generator = new RandomStringGenerator.Builder().withinRange('0', 'z')
|
|
|
|
|
.filteredBy(Character::isLetterOrDigit).build();
|
|
|
|
|
|
|
|
|
|
String semesterId;
|
|
|
|
|
try {
|
|
|
|
|
semesterId = getActualSemester(oauth_token, oauth_token_secret);
|
|
|
|
|
} catch (ParseException e) {
|
|
|
|
|
e.printStackTrace();
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
List<NameValuePair> queryParams = new ArrayList<>();
|
|
|
|
|
queryParams.add(new BasicNameValuePair("fields", "course_unit_id|group_number|class_type|class_type_id|course_id|course_fac_id|term_id|lecturers"));
|
|
|
|
|
queryParams.add(new BasicNameValuePair("oauth_consumer_key", propertiesLoader.getKey()));
|
|
|
|
|
queryParams.add(new BasicNameValuePair("oauth_nonce", "" + (int) (Math.random() * 100000000)));
|
|
|
|
|
queryParams.add(new BasicNameValuePair("oauth_signature_method", "HMAC-SHA1"));
|
|
|
|
|
queryParams.add(new BasicNameValuePair("oauth_timestamp", "" + (System.currentTimeMillis() / 1000)));
|
|
|
|
|
queryParams.add(new BasicNameValuePair("oauth_token", oauth_token));
|
|
|
|
|
queryParams.add(new BasicNameValuePair("oauth_version", "1.0"));
|
|
|
|
|
queryParams.add(new BasicNameValuePair("user_id", userId));
|
|
|
|
|
String oauth_signature = getSignature("GET", URLEncoder.encode(propertiesLoader.getUsosApiURL() + "/groups/lecturer", ENC), URLEncoder.encode(URLEncodedUtils.format(queryParams, ENC), ENC), oauth_token_secret);
|
|
|
|
|
queryParams.add(new BasicNameValuePair("oauth_signature", oauth_signature));
|
|
|
|
|
String url = "/groups/lecturer?" + URLEncodedUtils.format(queryParams, ENC);
|
|
|
|
|
Response response = given().urlEncodingEnabled(false).get(url);
|
|
|
|
|
JSONObject responseJSON = new JSONObject(response.getBody().print());
|
|
|
|
|
if (response.statusCode() == 200) {
|
|
|
|
|
responseJSON = responseJSON.getJSONObject("groups");
|
|
|
|
|
if (responseJSON.has(semesterId)) {
|
|
|
|
|
JSONArray subjects = responseJSON.getJSONArray(semesterId);
|
|
|
|
|
for (int i = 0; i < subjects.length(); i++) {
|
|
|
|
|
JSONObject subject = subjects.getJSONObject(i);
|
|
|
|
|
if (subject.getString("class_type_id").equalsIgnoreCase("WYK")) {
|
|
|
|
|
Optional<StudyGroup> group = groupRepository.findByUsosGroupId(subject.getString("course_id") + "-" + subject.getString("term_id"));
|
|
|
|
|
if (!group.isPresent()) {
|
|
|
|
|
StudyGroup studyGroup = new StudyGroup();
|
|
|
|
|
studyGroup.setName(subject.getJSONObject("course_name").getString("pl"));
|
|
|
|
|
studyGroup.setUsosGroupId(subject.getString("course_id") + "-" + subject.getString("term_id"));
|
|
|
|
|
studyGroup.setDescription("Wykład");
|
|
|
|
|
studyGroup.getMembers().add(new StudyGroupMember(studyGroup, userRepository.findByUsername(userId).get(), true));
|
|
|
|
|
String groupKey = generator.generate(10);
|
|
|
|
|
|
|
|
|
|
while (!this.groupRepository.findByGroupKey(groupKey).isEmpty()) {
|
|
|
|
|
groupKey = generator.generate(10);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
studyGroup.setGroupKey(groupKey);
|
|
|
|
|
groupRepository.save(studyGroup);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
updateGroupStudents(oauth_token, oauth_token_secret, semesterId);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void updateGroupStudents(String oauth_token, String oauth_token_secret, String semesterId) throws UnsupportedEncodingException, InvalidKeyException, NoSuchAlgorithmException {
|
|
|
|
|
List<NameValuePair> queryParams = new ArrayList<>();
|
|
|
|
|
queryParams.add(new BasicNameValuePair("fields", "course_editions[course_id|course_name|term_id|user_groups]"));
|
|
|
|
|
queryParams.add(new BasicNameValuePair("oauth_consumer_key", propertiesLoader.getKey()));
|
|
|
|
|
queryParams.add(new BasicNameValuePair("oauth_nonce", "" + (int) (Math.random() * 100000000)));
|
|
|
|
|
queryParams.add(new BasicNameValuePair("oauth_signature_method", "HMAC-SHA1"));
|
|
|
|
|
queryParams.add(new BasicNameValuePair("oauth_timestamp", "" + (System.currentTimeMillis() / 1000)));
|
|
|
|
|
queryParams.add(new BasicNameValuePair("oauth_token", oauth_token));
|
|
|
|
|
queryParams.add(new BasicNameValuePair("oauth_version", "1.0"));
|
|
|
|
|
String oauth_signature = getSignature("GET", URLEncoder.encode(propertiesLoader.getUsosApiURL() + "/courses/user", ENC), URLEncoder.encode(URLEncodedUtils.format(queryParams, ENC), ENC), oauth_token_secret);
|
|
|
|
|
queryParams.add(new BasicNameValuePair("oauth_signature", oauth_signature));
|
|
|
|
|
String url = "/courses/user?" + URLEncodedUtils.format(queryParams, ENC);
|
|
|
|
|
|
|
|
|
|
Response response = given().urlEncodingEnabled(false).get(url);
|
|
|
|
|
|
|
|
|
|
JSONObject jsonObject = new JSONObject(response.getBody().print());
|
|
|
|
|
JSONArray array = jsonObject.getJSONObject("course_editions").getJSONArray(semesterId);
|
|
|
|
|
for (int i = 0 ; i < array.length() ; i++){
|
|
|
|
|
JSONObject course = array.getJSONObject(i);
|
|
|
|
|
String groupId = course.getString("course_id") + "-" + course.getString("term_id");
|
|
|
|
|
Optional<StudyGroup> studyGroupCheck = groupRepository.findByUsosGroupId(groupId);
|
|
|
|
|
if (!studyGroupCheck.isPresent())
|
|
|
|
|
continue;
|
|
|
|
|
StudyGroup studyGroup = studyGroupCheck.get();
|
|
|
|
|
JSONArray participants = course.getJSONArray("user_groups").getJSONObject(0).getJSONArray("participants");
|
|
|
|
|
for (int j = 0 ; j < participants.length() ; j++){
|
|
|
|
|
String id = participants.getJSONObject(j).getString("id");
|
|
|
|
|
Optional<User> user = userRepository.findByUsosUserUsosId(id);
|
|
|
|
|
if (user.isPresent())
|
|
|
|
|
if (!studyGroupMemberRepository.findByUserUsosUserUsosIdAndGroupUsosGroupId(id, groupId).isPresent())
|
|
|
|
|
studyGroup.getMembers().add(new StudyGroupMember(studyGroup, user.get(), false));
|
|
|
|
|
}
|
|
|
|
|
groupRepository.save(studyGroup);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private String getActualSemester(String oauth_token, String oauth_token_secret) throws UnsupportedEncodingException, InvalidKeyException, NoSuchAlgorithmException, ParseException {
|
|
|
|
|
|
|
|
|
|
List<NameValuePair> queryParams = new ArrayList<>();
|
|
|
|
|
queryParams.add(new BasicNameValuePair("fields", "terms"));
|
|
|
|
|
queryParams.add(new BasicNameValuePair("oauth_consumer_key", propertiesLoader.getKey()));
|
|
|
|
|
queryParams.add(new BasicNameValuePair("oauth_nonce", "" + (int) (Math.random() * 100000000)));
|
|
|
|
|
queryParams.add(new BasicNameValuePair("oauth_signature_method", "HMAC-SHA1"));
|
|
|
|
|
queryParams.add(new BasicNameValuePair("oauth_timestamp", "" + (System.currentTimeMillis() / 1000)));
|
|
|
|
|
queryParams.add(new BasicNameValuePair("oauth_token", oauth_token));
|
|
|
|
|
queryParams.add(new BasicNameValuePair("oauth_version", "1.0"));
|
|
|
|
|
String oauth_signature = getSignature("GET", URLEncoder.encode(propertiesLoader.getUsosApiURL() + "/courses/user", ENC), URLEncoder.encode(URLEncodedUtils.format(queryParams, ENC), ENC), oauth_token_secret);
|
|
|
|
|
queryParams.add(new BasicNameValuePair("oauth_signature", oauth_signature));
|
|
|
|
|
String url = "/courses/user?" + URLEncodedUtils.format(queryParams, ENC);
|
|
|
|
|
|
|
|
|
|
Response response = given().urlEncodingEnabled(false).get(url);
|
|
|
|
|
JSONObject jsonObject = new JSONObject(response.getBody().print());
|
|
|
|
|
JSONArray jsonArray = new JSONArray(jsonObject.getJSONArray("terms").toString());
|
|
|
|
|
|
|
|
|
|
Date currentDate = new Date(System.currentTimeMillis());
|
|
|
|
|
|
|
|
|
|
for (int i = jsonArray.length() - 1 ; i >= 0 ; i++){
|
|
|
|
|
JSONObject academicYear = jsonArray.getJSONObject(i);
|
|
|
|
|
Date beginDate = new SimpleDateFormat("yyyy-MM-dd").parse(academicYear.getString("start_date"));
|
|
|
|
|
Date endDate = new SimpleDateFormat("yyyy-MM-dd").parse(academicYear.getString("end_date"));
|
|
|
|
|
if (currentDate.compareTo(beginDate) >= 0){
|
|
|
|
|
if (currentDate.compareTo(endDate) <= 0)
|
|
|
|
|
return academicYear.getString("id");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public String requestToken(String oauth_callback) throws UnsupportedEncodingException, InvalidKeyException, NoSuchAlgorithmException {
|
|
|
|
@ -163,14 +314,14 @@ public class AuthorizationService {
|
|
|
|
|
user.setUsername(id);
|
|
|
|
|
user = userRepository.save(user);
|
|
|
|
|
String token = getAuthToken(user.getUsername(), generatedPassword);
|
|
|
|
|
return new TokenResponseDTO(token, user.getUsername());
|
|
|
|
|
return new TokenResponseDTO(token, user.getUsername(), user.getUsosUser().getUsosId());
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
User user = userCheck.get();
|
|
|
|
|
user.getUsosUser().setPassword(bCryptPasswordEncoder.encode(generatedPassword));
|
|
|
|
|
user = userRepository.save(user);
|
|
|
|
|
String token = getAuthToken(user.getUsername(), generatedPassword);
|
|
|
|
|
return new TokenResponseDTO(token, user.getUsername());
|
|
|
|
|
return new TokenResponseDTO(token, user.getUsername(), user.getUsosUser().getUsosId());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|