Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,5 @@
/.project
/release
/target

.DS_Store
13 changes: 5 additions & 8 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,6 @@

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!-- select one for build + select plugin in IliasManager.java -->
<!-- supported: demo kit tueb stugge kn phtg hsf wbs ube-->
<project.university>ube</project.university>
</properties>

<organization>
Expand Down Expand Up @@ -39,7 +36,7 @@
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.16</version>
<version>1.18.30</version>
</dependency>

<dependency>
Expand Down Expand Up @@ -114,7 +111,7 @@
</goals>
<configuration>
<outputDirectory>
release/IliasDownloaderTool-${project.university}-${project.version}/lib
release/IliasDownloaderTool-${project.version}/lib
</outputDirectory>
</configuration>
</execution>
Expand All @@ -132,10 +129,10 @@
<configuration>
<target>
<copy file="target/Ilias-${project.version}.jar"
tofile="release/IliasDownloaderTool-${project.university}-${project.version}/Ilias-Downloader-Tool-${project.university}-${project.version}.jar">
tofile="release/IliasDownloaderTool-${project.version}/Ilias-Downloader-Tool-${project.version}.jar">
</copy>
<zip destfile="release/IliasDownloaderTool-${project.university}-${project.version}.zip"
basedir="release/IliasDownloaderTool-${project.university}-${project.version}"
<zip destfile="release/IliasDownloaderTool-${project.version}.zip"
basedir="release/IliasDownloaderTool-${project.version}"
/>
</target>
</configuration>
Expand Down
20 changes: 16 additions & 4 deletions src/main/java/control/IliasManager.java
Original file line number Diff line number Diff line change
@@ -1,21 +1,33 @@
package control;

import analytics.AnalyticsLogger;
import lombok.extern.slf4j.Slf4j;
import model.persistance.Plugin;
import model.persistance.Settings;
import org.apache.http.impl.client.CloseableHttpClient;
import plugin.*;
import plugin.IliasPlugin.LoginStatus;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.HashMap;
import java.util.Properties;

@Slf4j
public class IliasManager {

private IliasPlugin ilias;

private static IliasManager iliasManager;

private IliasManager() {
String magicVariable = "kn";
Plugin plugin = Settings.getInstance().getPlugin();

HashMap<String, IliasPlugin> map = new HashMap<>();
HashMap<String, IliasPlugin> map = new HashMap<>();
map.put("kn", new KNIlias());
map.put("kit", new KITIlias());
map.put("demo", new DemoIlias());
Expand All @@ -25,8 +37,8 @@ private IliasManager() {
map.put("ube", new UniBernIlias());
map.put("phtg", new PHTGIlias());
map.put("stugge", new StuggeIlias());

this.ilias = map.get(magicVariable);
map.put("fhdo", new FHDortmundIlias());
this.ilias = map.get(plugin.getName() == null ? "kn" : plugin.getName());
}

public static IliasManager getInstance() {
Expand Down
15 changes: 11 additions & 4 deletions src/main/java/control/IliasScraper.java
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ private List<IliasFolder> getCourses(String dashboardHtml) {
List<IliasFolder> courses = new ArrayList<>();
String s = null;
Document doc = Jsoup.parse(dashboardHtml);
List<Element> temp = doc.select("h4");
List<Element> temp = doc.select("h4");

for (Element x : temp) {
s = s + x.toString();
Expand All @@ -68,9 +68,12 @@ private List<IliasFolder> getCourses(String dashboardHtml) {
if (url.toLowerCase().contains("baseclass=ilrepositorygui") // kit + tueb + wbs
|| url.toLowerCase().contains("stuttgart_crs") // stuttgart
|| url.toLowerCase().contains("uni_crs") // konstanz
|| url.toLowerCase().contains("fhdo_crs") // FH DO
|| url.toLowerCase().contains("unibe_crs") // uni bern
|| url.toLowerCase().contains("goto_hsf") // hsf
|| url.toLowerCase().contains("cmdclass=ilrepositorygui")) // phtg
|| url.toLowerCase().contains("cmdclass=ilrepositorygui") // phtg
|| url.toLowerCase().contains("/go/crs")
)
{
String name = IliasCourseFormatter.formatCourseName(aTag.text());
courses.add(new IliasFolder(name, url, null));
Expand Down Expand Up @@ -104,9 +107,12 @@ public void run() {
final boolean linkToFolder = dir.attr("href").contains("cmd=view") // kit + wbs
|| dir.attr("href").toLowerCase().contains("stuttgart_fold") // stuttgart
|| dir.attr("href").toLowerCase().contains("hsf_fold") // hsf
|| dir.attr("href").toLowerCase().contains("fhdo_fold") // fh do
|| dir.attr("href").toLowerCase().contains("fhdo_grp") // fh do group
|| dir.attr("href").toLowerCase().contains("/go/fold/") // fh do folder
|| dir.attr("href").toLowerCase().contains("unibe_fold") // uni bern
|| dir.attr("href").toLowerCase().contains("uni_fold"); // konstanz
final boolean linkToFile = dir.attr("href").contains("download");
final boolean linkToFile = dir.attr("href").contains("download") || dir.attr("href").contains("cmd=sendfile") ;
final boolean linkToForum = dir.attr("href").contains("cmd=showThreads");
final boolean linkToHyperlink = false;

Expand Down Expand Up @@ -160,7 +166,8 @@ private List<Element> openFolder(IliasTreeNode kurs) {
List<Element> directory;
final String newHtmlContent = new IliasConnector().requestGet(kurs.getUrl());
Document doc = Jsoup.parse(newHtmlContent);
directory = doc.select("h4").select("a");
// Ilias seems to have switched to h3 in newer versions. Required to use h3 for FH Dormtund
directory = doc.select("h4, h3").select("a");
return directory;
}

Expand Down
38 changes: 38 additions & 0 deletions src/main/java/model/persistance/Plugin.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package model.persistance;

public class Plugin implements Storable {

public Plugin() {

}

public Plugin(String name, String display) {
this.name = name;
this.display = display;
}

private static final long serialVersionUID = 6880157243670452604L;
private String name;
private String display;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getDisplay() {
return display;
}

public void setDisplay(String display) {
this.display = display;
}

@Override
public String getStorageFileName() {
return "plugin.ser";
}
}
19 changes: 14 additions & 5 deletions src/main/java/model/persistance/Settings.java
Original file line number Diff line number Diff line change
Expand Up @@ -23,10 +23,12 @@ public class Settings {
private Storer storer;
private List<Storable> storableObjects;

private String IliasManager;
private User user;
private Flags flags;
private FileStates fileStates;
private IliasFolderSettings iliasFolderSettings;
private Plugin plugin;

private Settings() {
storableObjects = new ArrayList<Storable>();
Expand All @@ -40,6 +42,17 @@ public static Settings getInstance() {
return instance;
}

public Plugin getPlugin() {
if (plugin == null) {
plugin = (Plugin) load(new Plugin());
if (plugin == null) {
plugin = new Plugin();
}
storableObjects.add(plugin);
}
return plugin;
}

public User getUser() {
if (user == null) {
user = (User) load(new User());
Expand Down Expand Up @@ -86,11 +99,7 @@ public IliasFolderSettings getIliasFolderSettings() {
}

public void toggleFileIgnored(IliasFile file) {
if (file.isIgnored()) {
file.setIgnored(false);
} else {
file.setIgnored(true);
}
file.setIgnored(!file.isIgnored());
}

private Storable load(Storable storeable) {
Expand Down
4 changes: 2 additions & 2 deletions src/main/java/model/persistance/User.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,9 @@
public class User implements Storable {

private static final long serialVersionUID = 5177868027321120942L;
private String name;
private String name;
private String password;

public String getName() {
return name;
}
Expand Down
135 changes: 135 additions & 0 deletions src/main/java/plugin/FHDortmundIlias.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,135 @@
package plugin;

import lombok.extern.slf4j.Slf4j;
import org.apache.http.*;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.protocol.BasicHttpContext;
import org.apache.http.util.EntityUtils;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicReference;

@Slf4j
public class FHDortmundIlias extends IliasPlugin {

private HttpPost post;
private HttpResponse response;
private HttpEntity entity;
private String dashboardHTML;
private BasicHttpContext context;
private List<NameValuePair> nvps;

@Override
public LoginStatus login(String username, String password) {
LoginStatus loginStatus = LoginStatus.CONNECTION_FAILED;
context = new BasicHttpContext();
nvps = new ArrayList<>();

try {
HttpGet get = new HttpGet(getBaseUri() + "/login.php?client_id=ilias-fhdo&cmd=force_login&lang=en");

executeGet(get);

String html = null;
try {
html = EntityUtils.toString(entity);
} catch (IOException | ParseException e) {
log.warn(e.getMessage(), e);
}

Document doc = Jsoup.parse(html);
Element form = doc.select("form[name='login_form']").first();
Elements labels = form.select("label[for]");
AtomicReference<String> usernameKey = new AtomicReference<>("");
AtomicReference<String> passwordKey = new AtomicReference<>("");
labels.forEach((Element label) ->{
if (label.text().equals("Anmeldename*") || label.text().equals("Username*")) {
usernameKey.set(form.select("input[id='" + label.attr("for") + "']").first().attr("name"));
} else if (label.text().equals("Passwort*") || label.text().equals("Password*")) {
passwordKey.set(form.select("input[id='" + label.attr("for") + "']").first().attr("name"));
}
});

post = new HttpPost(getBaseUri() + "/" + form.attr("action"));
nvps.add(new BasicNameValuePair(usernameKey.get(), username));
nvps.add(new BasicNameValuePair(passwordKey.get(), password));
//nvps.add(new BasicNameValuePair("cmd[doStandardAuthentication]", "Login"));
post.setEntity(new UrlEncodedFormEntity(nvps, Consts.UTF_8));

executePost();

try {
String htmlStartpage = EntityUtils.toString(entity);
if (htmlStartpage.equals("1")) {
loginStatus = LoginStatus.CONNECTION_FAILED;
} else {
loginStatus = LoginStatus.SUCCESS;
this.dashboardHTML = htmlStartpage;
}
} catch (ParseException | IOException e) {
log.warn(e.getMessage(), e);
}
} finally {
post.releaseConnection();
}

return loginStatus;
}

private void executeGet(HttpGet get) {
try {
this.response = this.client.execute(get, this.context);
} catch (ClientProtocolException e) {
e.printStackTrace();
log.warn(e.getMessage(), e);
} catch (IOException e) {
e.printStackTrace();
log.warn(e.getMessage(), e);
} finally {
this.entity = this.response.getEntity();
}

this.nvps.clear();
}

private void executePost() {
try {
this.response = this.client.execute(this.post, this.context);
} catch (ClientProtocolException e) {
e.printStackTrace();
log.warn(e.getMessage(), e);
} catch (IOException e) {
e.printStackTrace();
log.warn(e.getMessage(), e);
} finally {
this.entity = this.response.getEntity();
}

this.nvps.clear();
}

@Override
public String getBaseUri() {
return "https://www.ilias.fh-dortmund.de/ilias";
}

@Override
public String getDashboardHTML() {
return this.dashboardHTML;
}

@Override
public String getShortName() {
return "fhdo";
}
}
Loading