Commit 44aa2e79 authored by Wolfgang Knopki's avatar Wolfgang Knopki
Browse files

Merge branch 'devel' into 'testing'

Devel

See merge request !6
parents b2b972df d321d182
Pipeline #616 passed with stage
in 12 seconds
...@@ -8,6 +8,8 @@ const bodyParser = require('body-parser'); ...@@ -8,6 +8,8 @@ const bodyParser = require('body-parser');
const session = require('express-session'); const session = require('express-session');
const errorhandler = require('errorhandler'); const errorhandler = require('errorhandler');
const flash = require('express-flash'); const flash = require('express-flash');
const fileUpload = require('express-fileupload');
const i18n = require('i18n'); // internationalization const i18n = require('i18n'); // internationalization
i18n.configure({ i18n.configure({
locales:['de', 'en'], locales:['de', 'en'],
...@@ -22,12 +24,20 @@ var app = express(); ...@@ -22,12 +24,20 @@ var app = express();
app.set('port', config.app.port); app.set('port', config.app.port);
app.set('views', __dirname + '/views'); app.set('views', __dirname + '/views');
app.set('view engine', 'pug'); app.set('view engine', 'pug');
// enable files upload
app.use(fileUpload({
createParentPath: true,
limits: {
fileSize: 1000000 // 1 MB max. file size
}
}));
app.use(morgan('combined')); app.use(morgan('combined'));
app.use(cookieParser()); app.use(cookieParser());
app.use(bodyParser.json()); app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: false})); app.use(bodyParser.urlencoded({extended: false}));
app.use(express.static(path.join(__dirname, 'public'))); app.use(express.static(path.join(__dirname, 'public')));
app.use(i18n.init); app.use(i18n.init);
app.use((req, res, next) => { app.use((req, res, next) => {
res.setLocale('de'); res.setLocale('de');
......
...@@ -9,8 +9,8 @@ module.exports = { ...@@ -9,8 +9,8 @@ module.exports = {
saml: { saml: {
path: process.env.SAML_PATH || '/saml/SSO', path: process.env.SAML_PATH || '/saml/SSO',
entryPoint: process.env.SAML_ENTRY_POINT || 'https://m4lab.hft-stuttgart.de/idp/saml2/idp/SSOService.php', entryPoint: process.env.SAML_ENTRY_POINT || 'https://m4lab.hft-stuttgart.de/idp/saml2/idp/SSOService.php',
//issuer: 'sp-account.m4lab.hft-stuttgart.de', //local metadata issuer: 'sp-account.m4lab.hft-stuttgart.de', //local metadata
issuer: 'sp-account-testing.m4lab.hft-stuttgart.de', //testing metadata //issuer: 'sp-account-testing.m4lab.hft-stuttgart.de', //testing metadata
//issuer: 'sp-account-prod.m4lab.hft-stuttgart.de', //production metadata //issuer: 'sp-account-prod.m4lab.hft-stuttgart.de', //production metadata
logoutUrl: 'https://m4lab.hft-stuttgart.de/idp/saml2/idp/SingleLogoutService.php' logoutUrl: 'https://m4lab.hft-stuttgart.de/idp/saml2/idp/SingleLogoutService.php'
} }
...@@ -22,6 +22,7 @@ module.exports = { ...@@ -22,6 +22,7 @@ module.exports = {
port: 3306, // MySQL port port: 3306, // MySQL port
dbUser: 'userdb', // User DB dbUser: 'userdb', // User DB
host_project: 'm4lab.hft-stuttgart.de', // DB host project db host_project: 'm4lab.hft-stuttgart.de', // DB host project db
//host_project: 'localhost', // local
dbProject: 'projectDB' // Project DB dbProject: 'projectDB' // Project DB
}, },
mailer: { mailer: {
......
...@@ -196,6 +196,14 @@ ...@@ -196,6 +196,14 @@
"fill-range": "^7.0.1" "fill-range": "^7.0.1"
} }
}, },
"busboy": {
"version": "0.3.1",
"resolved": "https://registry.npmjs.org/busboy/-/busboy-0.3.1.tgz",
"integrity": "sha512-y7tTxhGKXcyBxRKAni+awqx8uqaJKrSFSNFSeRG5CsWNdmy2BIK+6VGWEW7TZnIO/533mtMEA4rOevQV815YJw==",
"requires": {
"dicer": "0.3.0"
}
},
"bytes": { "bytes": {
"version": "3.1.0", "version": "3.1.0",
"resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
...@@ -432,6 +440,14 @@ ...@@ -432,6 +440,14 @@
"resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
"integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA="
}, },
"dicer": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/dicer/-/dicer-0.3.0.tgz",
"integrity": "sha512-MdceRRWqltEG2dZqO769g27N/3PXfcKl04VhYnBlo2YhH7zPi88VebsjTKclaOyiuMaGU72hTfw3VkUitGcVCA==",
"requires": {
"streamsearch": "0.1.2"
}
},
"doctypes": { "doctypes": {
"version": "1.1.0", "version": "1.1.0",
"resolved": "https://registry.npmjs.org/doctypes/-/doctypes-1.1.0.tgz", "resolved": "https://registry.npmjs.org/doctypes/-/doctypes-1.1.0.tgz",
...@@ -579,6 +595,14 @@ ...@@ -579,6 +595,14 @@
} }
} }
}, },
"express-fileupload": {
"version": "1.1.6",
"resolved": "https://registry.npmjs.org/express-fileupload/-/express-fileupload-1.1.6.tgz",
"integrity": "sha512-w24zPWT8DkoIxSVkbxYPo9hkTiLpCQQzNsLRTCnecBhfbYv+IkIC5uLw2MIUAxBZ+7UMmXPjGxlhzUXo4RcbZw==",
"requires": {
"busboy": "^0.3.1"
}
},
"express-flash": { "express-flash": {
"version": "0.0.2", "version": "0.0.2",
"resolved": "https://registry.npmjs.org/express-flash/-/express-flash-0.0.2.tgz", "resolved": "https://registry.npmjs.org/express-flash/-/express-flash-0.0.2.tgz",
...@@ -1759,6 +1783,11 @@ ...@@ -1759,6 +1783,11 @@
"resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
"integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow="
}, },
"streamsearch": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz",
"integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo="
},
"string-width": { "string-width": {
"version": "2.1.1", "version": "2.1.1",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
......
...@@ -62,12 +62,12 @@ module.exports = function (app, config, passport, i18n) { ...@@ -62,12 +62,12 @@ module.exports = function (app, config, passport, i18n) {
failureFlash: true failureFlash: true
}), }),
function (req, res) { function (req, res) {
res.redirect('/account/'); res.redirect('/');
} }
); );
// to generate Service Provider's XML metadata // to generate Service Provider's XML metadata
app.get('/saml/metadata', app.get('/saml/metadata',
function(req, res) { function(req, res) {
res.type('application/xml'); res.type('application/xml');
var spMetadata = samlStrategy.generateServiceProviderMetadata(fs.readFileSync(__dirname + '/cert/cert.pem', 'utf8')); var spMetadata = samlStrategy.generateServiceProviderMetadata(fs.readFileSync(__dirname + '/cert/cert.pem', 'utf8'));
...@@ -104,8 +104,8 @@ module.exports = function (app, config, passport, i18n) { ...@@ -104,8 +104,8 @@ module.exports = function (app, config, passport, i18n) {
} }
}) })
} else { } else {
res.redirect('/account/login'); // localhost res.redirect('/login'); // localhost
} }
}); });
app.get('/login', app.get('/login',
...@@ -118,14 +118,14 @@ module.exports = function (app, config, passport, i18n) { ...@@ -118,14 +118,14 @@ module.exports = function (app, config, passport, i18n) {
app.get('/logout', function (req, res) { app.get('/logout', function (req, res) {
if (req.user == null) { if (req.user == null) {
return res.redirect('/account/'); return res.redirect('/');
} }
req.user.nameID = req.user.id; req.user.nameID = req.user.id;
req.user.nameIDFormat = req.user.idFormat; req.user.nameIDFormat = req.user.idFormat;
return samlStrategy.logout(req, function(err, uri) { return samlStrategy.logout(req, function(err, uri) {
req.logout(); req.logout();
if ( req.session ) { if ( req.session ) {
req.session.destroy((err) => { req.session.destroy((err) => {
if(err) { if(err) {
...@@ -133,7 +133,7 @@ module.exports = function (app, config, passport, i18n) { ...@@ -133,7 +133,7 @@ module.exports = function (app, config, passport, i18n) {
} }
}); });
} }
return res.redirect(uri); return res.redirect(uri);
}); });
}); });
...@@ -149,7 +149,7 @@ module.exports = function (app, config, passport, i18n) { ...@@ -149,7 +149,7 @@ module.exports = function (app, config, passport, i18n) {
} }
}) })
} else { } else {
res.redirect('/account/login'); res.redirect('/login');
} }
}); });
...@@ -183,7 +183,7 @@ module.exports = function (app, config, passport, i18n) { ...@@ -183,7 +183,7 @@ module.exports = function (app, config, passport, i18n) {
// create JSON object of projects and user status for front-end // create JSON object of projects and user status for front-end
function(userProjects, projectsOverview, done) { function(userProjects, projectsOverview, done) {
var allProjects = [] // JSON object var allProjects = [] // JSON object
var userProjectId = [] // array of user's project_id var userProjectId = [] // array of user's project_id
for (var i = 0; i < userProjects.length; i++) { for (var i = 0; i < userProjects.length; i++) {
userProjectId.push(userProjects[i].project_id) userProjectId.push(userProjects[i].project_id)
...@@ -213,7 +213,7 @@ module.exports = function (app, config, passport, i18n) { ...@@ -213,7 +213,7 @@ module.exports = function (app, config, passport, i18n) {
} }
]) ])
} else { } else {
res.redirect('/account/login'); res.redirect('/login');
} }
}); });
...@@ -223,7 +223,7 @@ module.exports = function (app, config, passport, i18n) { ...@@ -223,7 +223,7 @@ module.exports = function (app, config, passport, i18n) {
user: req.user // useful for view engine, useless for HTML user: req.user // useful for view engine, useless for HTML
}); });
} else { } else {
res.redirect('/account/login'); res.redirect('/login');
} }
}); });
...@@ -238,7 +238,7 @@ module.exports = function (app, config, passport, i18n) { ...@@ -238,7 +238,7 @@ module.exports = function (app, config, passport, i18n) {
industry: req.body.inputIndustry, industry: req.body.inputIndustry,
speciality: req.body.inputSpeciality, speciality: req.body.inputSpeciality,
} }
if (req.isAuthenticated()) { if (req.isAuthenticated()) {
if (userData.email) { if (userData.email) {
dbconn.user.query('UPDATE user SET ? WHERE email = "' +userData.email+'"', userData, function (err, rows, fields) { dbconn.user.query('UPDATE user SET ? WHERE email = "' +userData.email+'"', userData, function (err, rows, fields) {
...@@ -250,14 +250,14 @@ module.exports = function (app, config, passport, i18n) { ...@@ -250,14 +250,14 @@ module.exports = function (app, config, passport, i18n) {
//req.flash('success', 'Profile updated!'); //req.flash('success', 'Profile updated!');
req.flash('success', 'Ihr Benutzerprofil wurde aktualisiert!'); req.flash('success', 'Ihr Benutzerprofil wurde aktualisiert!');
} }
res.redirect('/account/profile'); res.redirect('/profile');
}) })
} }
} else { } else {
res.redirect('/account/login'); res.redirect('/login');
} }
}); });
app.post('/changePwd', function (req, res) { app.post('/changePwd', function (req, res) {
if (req.isAuthenticated()) { if (req.isAuthenticated()) {
var currPwd = req.body.inputCurrPwd var currPwd = req.body.inputCurrPwd
...@@ -269,27 +269,32 @@ module.exports = function (app, config, passport, i18n) { ...@@ -269,27 +269,32 @@ module.exports = function (app, config, passport, i18n) {
// Load hashed passwd from DB // Load hashed passwd from DB
dbconn.user.query('SELECT password FROM credential WHERE user_id='+userId, function (err, rows, fields) { dbconn.user.query('SELECT password FROM credential WHERE user_id='+userId, function (err, rows, fields) {
if (err) { if (err) {
res.redirect('/500') console.error(err)
throw err res.status(500).render(lang+'/500', {
error: err
})
} }
var userPwd = rows[0].password var userPwd = rows[0].password
// check if the password is correct // check if the password is correct
bcrypt.compare(currPwd, userPwd, function(err, isMatch) { bcrypt.compare(currPwd, userPwd, function(err, isMatch) {
if (err) { if (err) {
res.redirect('/500') console.error(err)
throw err res.status(500).render(lang+'/500', {
error: err
})
} }
else if (!isMatch) { else if (!isMatch) {
//req.flash('error', "Sorry, your password was incorrect. Please double-check your password.") //req.flash('error', "Sorry, your password was incorrect. Please double-check your password.")
req.flash('error', "Das Passwort ist leider falsch. Bitte überprüfen Sie Ihre Eingabe.") req.flash('error', "Das Passwort ist leider falsch. Bitte überprüfen Sie Ihre Eingabe.")
//res.redirect('/security') //res.redirect('/security')
res.redirect('/account/security') res.redirect('/security')
} }
else { else {
if ( newPwd != retypePwd ) { if ( newPwd != retypePwd ) {
req.flash('error', "Passwords do no match. Please make sure you re-type your new password correctly.") //req.flash('error', "Passwords do no match. Please make sure you re-type your new password correctly.")
res.redirect('/account/security') req.flash('error', 'Passwörter stimmen nicht überein. Bitte stellen Sie sicher, dass Sie das Passwort beide Male genau gleich eingeben.')
res.redirect('/security')
} }
else { else {
// update password // update password
...@@ -318,19 +323,19 @@ module.exports = function (app, config, passport, i18n) { ...@@ -318,19 +323,19 @@ module.exports = function (app, config, passport, i18n) {
} }
}); });
} }
res.redirect('/account/security') res.redirect('/security')
}) })
}); });
}); });
} }
} }
}) })
}) })
} }
}) })
} }
else { else {
res.redirect('/account/login'); res.redirect('/login');
} }
}); });
...@@ -348,7 +353,7 @@ module.exports = function (app, config, passport, i18n) { ...@@ -348,7 +353,7 @@ module.exports = function (app, config, passport, i18n) {
"we've received a request to reset your password. However, this email address is not on our database of registered users.\n\n"+ "we've received a request to reset your password. However, this email address is not on our database of registered users.\n\n"+
"Thanks,\nM4_LAB Team"; "Thanks,\nM4_LAB Team";
var emailSubject = "Account Access Attempted"; */ var emailSubject = "Account Access Attempted"; */
async.waterfall([ async.waterfall([
function(done) { function(done) {
crypto.randomBytes(20, function(err, buf) { crypto.randomBytes(20, function(err, buf) {
...@@ -406,7 +411,7 @@ module.exports = function (app, config, passport, i18n) { ...@@ -406,7 +411,7 @@ module.exports = function (app, config, passport, i18n) {
req.flash('success', 'Wenn Ihre E-Mail-Adresse registriert ist, wurde eine E-Mail mit dem weiteren Vorgehen an ' + emailAddress + ' versendet.'); req.flash('success', 'Wenn Ihre E-Mail-Adresse registriert ist, wurde eine E-Mail mit dem weiteren Vorgehen an ' + emailAddress + ' versendet.');
} }
//res.redirect('/forgotPwd'); // deployment //res.redirect('/forgotPwd'); // deployment
res.redirect('/account/forgotPwd'); // localhost res.redirect('/forgotPwd'); // localhost
}); });
}); });
...@@ -416,7 +421,7 @@ module.exports = function (app, config, passport, i18n) { ...@@ -416,7 +421,7 @@ module.exports = function (app, config, passport, i18n) {
//req.flash('error', 'Password reset token is invalid or has expired.'); //req.flash('error', 'Password reset token is invalid or has expired.');
req.flash('error', 'Der Schlüssel zum zurücksetzen des Passworts ist ungültig oder abgelaufen.'); req.flash('error', 'Der Schlüssel zum zurücksetzen des Passworts ist ungültig oder abgelaufen.');
//res.redirect('/forgotPwd'); // deployment //res.redirect('/forgotPwd'); // deployment
res.redirect('/account/forgotPwd'); // localhost res.redirect('/forgotPwd'); // localhost
} }
else { else {
res.render(lang+'/account/reset'); res.render(lang+'/account/reset');
...@@ -455,7 +460,7 @@ module.exports = function (app, config, passport, i18n) { ...@@ -455,7 +460,7 @@ module.exports = function (app, config, passport, i18n) {
} }
}); });
// redirect to login page // redirect to login page
res.redirect('/account/login') res.redirect('/login')
} }
}) })
}); });
...@@ -463,10 +468,10 @@ module.exports = function (app, config, passport, i18n) { ...@@ -463,10 +468,10 @@ module.exports = function (app, config, passport, i18n) {
} }
else { else {
req.flash('error', "User not found.") req.flash('error', "User not found.")
res.redirect('/account/login') res.redirect('/login')
} }
}); });
}); });
// todo: user registration with captcha // todo: user registration with captcha
...@@ -507,9 +512,9 @@ module.exports = function (app, config, passport, i18n) { ...@@ -507,9 +512,9 @@ module.exports = function (app, config, passport, i18n) {
} }
else { else {
//req.flash('success', 'Your account has been created. Please log in.') //req.flash('success', 'Your account has been created. Please log in.')
req.flash('success', 'Ihr Benutzerkonto wurde angelegt. Bitte melden Sie sich an.') req.flash('success', 'Ihr Benutzerkonto wurde angelegt. Bitte melden Sie sich an.')
} }
res.redirect('/account/registration'); res.redirect('/registration');
}) })
}); });
}); });
......
...@@ -2,6 +2,8 @@ const methods = require('./methods') ...@@ -2,6 +2,8 @@ const methods = require('./methods')
const async = require('async') const async = require('async')
const helpers = require('./helpers') const helpers = require('./helpers')
const pictSizeLimit = 1000000 // 1 MB
module.exports = function (app) { module.exports = function (app) {
// ======== APP ROUTES - PROJECT ==================== // ======== APP ROUTES - PROJECT ====================
...@@ -104,7 +106,7 @@ module.exports = function (app) { ...@@ -104,7 +106,7 @@ module.exports = function (app) {
res.render(lang+'/project/addProjectOverview') res.render(lang+'/project/addProjectOverview')
} }
else { else {
res.redirect('/account/login') res.redirect('/login')
} }
}) })
...@@ -144,7 +146,7 @@ module.exports = function (app) { ...@@ -144,7 +146,7 @@ module.exports = function (app) {
if (err) { if (err) {
//req.flash('error', "Failed") //req.flash('error', "Failed")
req.flash('error', "Fehlgeschlagen") req.flash('error', "Fehlgeschlagen")
res.redirect('/account/addProjectOverview'); res.redirect('/addProjectOverview');
} }
else { else {
req.flash('success', 'Your project has been created.') req.flash('success', 'Your project has been created.')
...@@ -160,13 +162,45 @@ module.exports = function (app) { ...@@ -160,13 +162,45 @@ module.exports = function (app) {
if (req.body.wiki) if (req.body.wiki)
wiki = 1 wiki = 1
var projectLogo = req.files.logo
var projectPicture = req.files.src
var projectLogoPath, projectPicturePath
if (projectLogo) {
// raise error if size limit is exceeded
if (projectLogo.size === pictSizeLimit) {
req.flash('error', 'Projektlogo exceeds 1 MB');
res.redirect('/addprojectoverview');
}
else {
// TEST PATH FOR DEVELOPMENT (LOCALHOST)
projectLogoPath = './folder-in-server-to-save-projektlogo/'+req.body.pname+'/'+projectLogo.name
// PATH FOR TEST/LIVE SERVER
// var projectLogoPath = to-be-defined
}
}
if (projectPicture) {
// raise error if size limit is exceeded
if (projectPicture.size === pictSizeLimit) {
req.flash('error', 'Projektbild exceeds 1 MB');
res.redirect('/addprojectoverview');
}
else {
// TEST PATH FOR DEVELOPMENT (LOCALHOST)
projectPicturePath = './folder-in-server-to-save-projektbild/'+req.body.pname+'/'+projectPicture.name
// PATH FOR TEST/LIVE SERVER
// var projectPicturePath = to-be-defined
}
}
var projectTerm = req.body.termForm + " - " + req.body.termTo var projectTerm = req.body.termForm + " - " + req.body.termTo
var projectOverviewData = { var projectOverviewData = {
pname: req.body.pname, pname: req.body.pname,
title: req.body.title, title: req.body.title,
onelinesummary: req.body.summary, onelinesummary: req.body.summary,
category: req.body.category, category: req.body.category,
logo: req.body.logo, logo: projectLogoPath,
gitlab: req.body.gitlabURL, gitlab: req.body.gitlabURL,
wiki: wiki, wiki: wiki,
overview: req.body.overview, overview: req.body.overview,
...@@ -178,7 +212,7 @@ module.exports = function (app) { ...@@ -178,7 +212,7 @@ module.exports = function (app) {
term: projectTerm, term: projectTerm,
further_details: req.body.furtherDetails, further_details: req.body.furtherDetails,
website: req.body.website, website: req.body.website,
src: req.body.src, src: projectPicturePath,
caption: req.body.caption, caption: req.body.caption,
contact_lastname: req.body.contactName, contact_lastname: req.body.contactName,
contact_email: req.body.contactEmail, contact_email: req.body.contactEmail,
...@@ -186,6 +220,28 @@ module.exports = function (app) { ...@@ -186,6 +220,28 @@ module.exports = function (app) {
leader_email: req.body.leaderEmail leader_email: req.body.leaderEmail
} }
// save pictures
if (projectLogo) {
projectLogo.mv(projectLogoPath, function(err) {
if (err) {
console.error(err)
res.status(500).render(lang+'/500', {
error: err
})
}
});
}
if (projectPicture) {
projectPicture.mv(projectPicturePath, function(err) {
if (err) {
console.error(err)
res.status(500).render(lang+'/500', {
error: err
})
}
});
}
/* RS: Temporary solution while Project DB is still in early phase. /* RS: Temporary solution while Project DB is still in early phase.
When User DB and Project DB are integrated and quite stabil, this operation should be done in 1 transaction. When User DB and Project DB are integrated and quite stabil, this operation should be done in 1 transaction.
*/ */
...@@ -224,7 +280,7 @@ module.exports = function (app) { ...@@ -224,7 +280,7 @@ module.exports = function (app) {
if (err) { if (err) {
//req.flash('error', "Failed") //req.flash('error', "Failed")
req.flash('error', "Fehlgeschlagen") req.flash('error', "Fehlgeschlagen")
res.redirect('/account/addProjectOverview'); res.redirect('/addProjectOverview');
} }
else { else {
req.flash('success', 'Your project has been created.') req.flash('success', 'Your project has been created.')
......
...@@ -34,9 +34,9 @@ html(lang="de") ...@@ -34,9 +34,9 @@ html(lang="de")
h5 h5
span #{user.firstname} #{user.lastname} span #{user.firstname} #{user.lastname}
div(class="nav flex-column nav-pills", id="v-pills-tab", role="tablist", aria-orientation="vertical") div(class="nav flex-column nav-pills", id="v-pills-tab", role="tablist", aria-orientation="vertical")
a(class="nav-link" href="/account/profile" aria-selected="true") Benutzerprofil a(class="nav-link" href="/profile" aria-selected="true") Benutzerprofil
a(class="nav-link" href="/account/security" aria-selected="false") Sicherheitseinstellungen a(class="nav-link" href="/security" aria-selected="false") Sicherheitseinstellungen
a(class="nav-link" href="/account/services" aria-selected="false") Projekte und Dienste a(class="nav-link" href="/services" aria-selected="false") Projekte und Dienste
a(class="nav-link" href="/logout" aria-selected="false") Logout a(class="nav-link" href="/logout" aria-selected="false") Logout
div(class="col-sm-9") div(class="col-sm-9")
p content goes here p content goes here
......
...@@ -35,8 +35,8 @@ html(lang="de") ...@@ -35,8 +35,8 @@ html(lang="de")
span #{user.firstname} #{user.lastname} span #{user.firstname} #{user.lastname}
div(class="nav flex-column nav-pills", id="v-pills-tab", role="tablist", aria-orientation="vertical") div(class="nav flex-column nav-pills", id="v-pills-tab", role="tablist", aria-orientation="vertical")
a(class="nav-link" href="#" aria-selected="true") Benutzerprofil a(class="nav-link" href="#" aria-selected="true") Benutzerprofil
a(class="nav-link" href="/account/security" aria-selected="false") Sicherheitseinstellungen a(class="nav-link" href="/security" aria-selected="false") Sicherheitseinstellungen
a(class="nav-link" href="/account/services" aria-selected="false") Projekte und Dienste a(class="nav-link" href="/services" aria-selected="false") Projekte und Dienste
a(class="nav-link" href="/logout" aria-selected="false") Logout a(class="nav-link" href="/logout" aria-selected="false") Logout
div(class="col-sm-9") div(class="col-sm-9")
if successes if successes
...@@ -47,7 +47,7 @@ html(lang="de") ...@@ -47,7 +47,7 @@ html(lang="de")
for error, i in errors for error, i in errors
div.alert.alert-danger.alert-dismissible.fade.show #{ error } div.alert.alert-danger.alert-dismissible.fade.show #{ error }
a(class="close", href="#", data-dismiss="alert", aria-label="close") &times; a(class="close", href="#", data-dismiss="alert", aria-label="close") &times;
form#profileForm(method="POST", action="/account/updateProfile") form#profileForm(method="POST", action="/updateProfile")
div(class="form-row") div(class="form-row")
div(class='form-group col-md-2') div(class='form-group col-md-2')
label(for="title") Anrede label(for="title") Anrede
......
...@@ -37,9 +37,9 @@ html(lang="de") ...@@ -37,9 +37,9 @@ html(lang="de")
h5 h5
span #{user.firstName} #{user.lastName} span #{user.firstName} #{user.lastName}
div(class="nav flex-column nav-pills", id="v-pills-tab", role="tablist", aria-orientation="vertical") div(class="nav flex-column nav-pills", id="v-pills-tab", role="tablist", aria-orientation="vertical")
a(class="nav-link" href="/account/profile" aria-selected="true") Benutzerprofil a(class="nav-link" href="/profile" aria-selected="true") Benutzerprofil
a(class="nav-link" href="#" aria-selected="false") Sicherheitseinstellungen a(class="nav-link" href="#" aria-selected="false") Sicherheitseinstellungen
a(class="nav-link" href="/account/services" aria-selected="false") Projekte und Dienste a(class="nav-link" href="/services" aria-selected="false") Projekte und Dienste
a(class="nav-link" href="/logout" aria-selected="false") Logout a(class="nav-link" href="/logout" aria-selected="false") Logout
div(class="col-sm-9") div(class="col-sm-9")
if successes if successes
...@@ -50,7 +50,7 @@ html(lang="de") ...@@ -50,7 +50,7 @@ html(lang="de")
for error, i in errors for error, i in errors
div.alert.alert-danger.alert-dismissible.fade.show #{ error } div.alert.alert-danger.alert-dismissible.fade.show #{ error }
a(class="close", href="#", data-dismiss="alert", aria-label="close") &times; a(class="close", href="#", data-dismiss="alert", aria-label="close") &times;
form(class="needs-validation", method="post", action="/account/changePwd" novalidate) form(class="needs-validation", method="post", action="/changePwd" novalidate)
div(class="form-group row") div(class="form-group row")
label(for="currPwd") Aktuelles Passwort label(for="currPwd") Aktuelles Passwort
input(id="inputCurrPwd", name="inputCurrPwd", type="password", class="form-control" required) input(id="inputCurrPwd", name="inputCurrPwd", type="password", class="form-control" required)
......
...@@ -34,8 +34,8 @@ html(lang="de") ...@@ -34,8 +34,8 @@ html(lang="de")
h5 h5
span #{user.firstName} #{user.lastName} span #{user.firstName} #{user.lastName}
div(class="nav flex-column nav-pills", id="v-pills-tab", role="tablist", aria-orientation="vertical") div(class="nav flex-column nav-pills", id="v-pills-tab", role="tablist", aria-orientation="vertical")
a(class="nav-link" href="/account/profile" aria-selected="true") Benutzerprofil a(class="nav-link" href="/profile" aria-selected="true") Benutzerprofil
a(class="nav-link" href="/account/security" aria-selected="false") Sicherheitseinstellungen a(class="nav-link" href="/security" aria-selected="false") Sicherheitseinstellungen
a(class="nav-link" href="#" aria-selected="false") Projekte und Dienste a(class="nav-link" href="#" aria-selected="false") Projekte und Dienste
a(class="nav-link" href="/logout" aria-selected="false") Logout a(class="nav-link" href="/logout" aria-selected="false") Logout
div(class="col-sm-9") div(class="col-sm-9")
......
...@@ -43,12 +43,12 @@ html(lang="de") ...@@ -43,12 +43,12 @@ html(lang="de")
for error, i in errors for error, i in errors
div.alert.alert-danger.alert-dismissible.fade.show #{ error } div.alert.alert-danger.alert-dismissible.fade.show #{ error }
a(class="close", href="#", data-dismiss="alert", aria-label="close") &times; a(class="close", href="#", data-dismiss="alert", aria-label="close") &times;
form(method="POST") form(method="POST" encType="multipart/form-data")
div(class='form-row') div(class='form-row')
div(class='form-group col-md-12') div(class='form-group col-md-12')
input#inputPname(name="pname" class="form-control" type="text" placeholder="Projekttitel*" required) input#inputPname(name="title" class="form-control" type="text" placeholder="Projekttitel*" required)
div(class="form-group col-md-12") div(class="form-group col-md-12")
input#inputTitle(name="title" class="form-control" type="text" placeholder="Akronym*" required) input#inputTitle(name="pname" class="form-control" type="text" placeholder="Akronym*" required)
div(class="form-group col-md-12") div(class="form-group col-md-12")
input#inputSummary(name="summary" class="form-control" type="text" placeholder="Kurzbeschreibung") input#inputSummary(name="summary" class="form-control" type="text" placeholder="Kurzbeschreibung")
div(class='form-group col-md-12') div(class='form-group col-md-12')
...@@ -59,7 +59,10 @@ html(lang="de") ...@@ -59,7 +59,10 @@ html(lang="de")
option(value="Lehr Projekt") Lehr Projekt option(value="Lehr Projekt") Lehr Projekt
option(value="Transfer-projekt") Transfer-projekt option(value="Transfer-projekt") Transfer-projekt
div(class="form-group col-md-12") div(class="form-group col-md-12")
input#inputLogo(name="logo" class="form-control" type="text" placeholder="Projektlogo, to be implemented: upload picture") div(class='form-group row')
label(for="projectLogo" class="col-sm-3 col-form-label") Projektlogo (max. 1 MB)
div(class="col-md-9")
input#inputLogo(name="logo" class="form-control" type="file")
div(class="form-group col-md-12") div(class="form-group col-md-12")
div(class="input-group mb-3") div(class="input-group mb-3")
input#inputGitlabURL(name="gitlabURL" type="text" class="form-control" placeholder="M4_LAB GitLab Project URL, z.B. https://transfer.hft-stuttgart.de/gitlab/username/projectname") input#inputGitlabURL(name="gitlabURL" type="text" class="form-control" placeholder="M4_LAB GitLab Project URL, z.B. https://transfer.hft-stuttgart.de/gitlab/username/projectname")
...@@ -85,12 +88,11 @@ html(lang="de") ...@@ -85,12 +88,11 @@ html(lang="de")
div(class='form-group col-md-12') div(class='form-group col-md-12')
input#inputAnnouncement(name="announcement" class="form-control" type="text" rows="5" placeholder="Ausschreibung") input#inputAnnouncement(name="announcement" class="form-control" type="text" rows="5" placeholder="Ausschreibung")
div(class="form-group col-md-12") div(class="form-group col-md-12")
div(class='form-row') div(class='form-group row')
div(class="form-group col-md-2") label(for="projectLogo" class="col-sm-2 col-form-label") Laufzeit
<p class="font-weight-normal">Laufzeit</p> div(class="col-md-5")
div(class="form-group col-md-5")
input#inputTermFrom(name="termForm" class="form-control" type="text" placeholder="von (dd.mm.yyyy)") input#inputTermFrom(name="termForm" class="form-control" type="text" placeholder="von (dd.mm.yyyy)")
div(class="form-group col-md-5") div(class="col-md-5")
input#inputTermTo(name="termTo" class="form-control" type="text" placeholder="bis (dd.mm.yyyy)") input#inputTermTo(name="termTo" class="form-control" type="text" placeholder="bis (dd.mm.yyyy)")
div(class='form-group col-md-12') div(class='form-group col-md-12')
textarea#inputFurtherDetails(name="furtherDetails" class="form-control" type="text" rows="5" placeholder="Weitere Informationen (bspw. Links zu Berichten)") textarea#inputFurtherDetails(name="furtherDetails" class="form-control" type="text" rows="5" placeholder="Weitere Informationen (bspw. Links zu Berichten)")
...@@ -99,7 +101,10 @@ html(lang="de") ...@@ -99,7 +101,10 @@ html(lang="de")
h5(class="mb-3 font-weight-bold") Bilder h5(class="mb-3 font-weight-bold") Bilder
div(class='form-row') div(class='form-row')
div(class="form-group col-md-12") div(class="form-group col-md-12")
input#inputSrc(name="src" class="form-control" type="text" placeholder="To be implemented: upload picture") div(class='form-group row')
label(for="projectPicture" class="col-sm-3 col-form-label") Projektbild (max. 1 MB)
div(class="col-md-9")
input#inputSrc(name="src" class="form-control" type="file")
div(class="form-group col-md-12") div(class="form-group col-md-12")
input#inputCaption(name="caption" class="form-control" type="text" placeholder="Bildunterschrift/Bildquelle") input#inputCaption(name="caption" class="form-control" type="text" placeholder="Bildunterschrift/Bildquelle")
h5(class="mb-3 font-weight-bold") Kontakt h5(class="mb-3 font-weight-bold") Kontakt
......
...@@ -7,35 +7,39 @@ html(lang="de") ...@@ -7,35 +7,39 @@ html(lang="de")
link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/bootstrap/bootstrap.css") link(rel="stylesheet", type="text/css", href="https://transfer.hft-stuttgart.de/css/bootstrap/bootstrap.css")
link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous") link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous")
style. style.
.collapse { .help .card-title > a:before {
display: none; float: right !important;
} content: "-";
.collapse.in { padding-right: 5px;
display: block; }
} .help .card-title > a.collapsed:before {
.collapsing { float: right !important;
position: relative; content: "+";
height: 0; }
overflow: hidden; .help h3 > a {
-webkit-transition-timing-function: ease; color: #8a348b;
-o-transition-timing-function: ease; text-decoration: none;
transition-timing-function: ease; display: block;
-webkit-transition-duration: .35s; }
-o-transition-duration: .35s; .help a {
transition-duration: .35s; display: inline;
-webkit-transition-property: height,visibility; }
-o-transition-property: height,visibility; .help .card > .card-header {
transition-property: height,visibility; color: #fff;
} }
.warning { .card-title {
color: red; margin-bottom: 0.5rem;
font-size: 11px; margin-top: 0.5rem;
} }
#infoicon {
color: #8a348b;
}
body body
include project.html include project.html
// jQuery // jQuery
script(src="https://code.jquery.com/jquery-3.3.1.min.js") script(src="https://code.jquery.com/jquery-3.3.1.min.js")
script(src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js", integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1", crossorigin="anonymous") script(src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js", integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1", crossorigin="anonymous")
// Bootstrap // Bootstrap
...@@ -44,4 +48,5 @@ html(lang="de") ...@@ -44,4 +48,5 @@ html(lang="de")
if isUserAuthenticated if isUserAuthenticated
script(src="/js/headfootLogout.js") script(src="/js/headfootLogout.js")
else else
script(src="/js/headfoot.js") script(src="/js/headfoot.js")
\ No newline at end of file
<div class="container"> <div class="container">
<hr /> <hr />
<!-- text: Zweck dieser Seite / purpose of this page --> <!-- text: Zweck dieser Seite / purpose of this page -->
<i class="fas fa-info-circle"></i> Diese Seite bietet den Einstieg zu den unterschiedlichen Projekten, die in unserem Portal für die Öffentlichkeit bereitgestellt werden. <div>
Für diesen Zweck steht zur Zeit ein Dienst bereit: eine von der HFT selbst verwaltete Gitlab-Instanz. <i id="infoicon" class="fas fa-info-circle fa-lg"></i>
Alle der in diesem Gitlab erfassten Projektinhalte unterliegen einer Open Source bzw. Open Data Lizenz. Diese Seite bietet den Einstieg zu den unterschiedlichen Projekten, die in
<p>Hinweis: Die Nutzeroberfläche von GitLab ist in Englisch.</p> unserem Portal für die Öffentlichkeit bereitgestellt werden.
Für diesen Zweck steht zur Zeit ein Dienst bereit: eine von der HFT selbst verwaltete Gitlab-Instanz.
Alle der in diesem Gitlab erfassten Projektinhalte unterliegen einer Open Source bzw. Open Data Lizenz.
<p class="font-italic"><b>Hinweis: </b>Die Nutzeroberfläche von GitLab ist in Englisch.</p>
</div>
<!-- link: Gitlab Projekte / Gitlab project list -->
<h2> Direkteinstieg </h2>
<a href="https://transfer.hft-stuttgart.de/gitlab/explore/projects"> <i class="fas fa-chevron-right">Gitlab Projects</i></a>
<!-- text: Hilfestellung zu Gitlab / short help about Gitlab -->
<hr />
<h2> Hilfestellung zu GitLab </h2>
<h3> <i class="fas fa-question-circle"></i> Möchten Sie die Projektinhalte ansehen oder herunterladen? </h3> <!-- link: Gitlab Projekte / Gitlab project list -->
<p> <h2> Direkteinstieg </h2>
Dann klicken Sie auf diesen <a href="https://transfer.hft-stuttgart.de/gitlab/explore/projects"> <i class="fas fa-chevron-right">Link zu den Gitlab-Projekten</i></a> um die Liste aller im Gitlab erfassten Projekte zu sehen. <a href="https://transfer.hft-stuttgart.de/gitlab/explore/projects"> <i class="fas fa-chevron-right">Gitlab
Vor dort können Sie dann auf die einzelnen Projekte zugreifen. Projects</i></a>
Ein Anmelden am Portal ist dazu nicht nötig.
</p>
<h3> <i class="fas fa-question-circle"></i> Möchten Sie zu einem Projekt beitragen? </h3>
<p>
Wenn Sie dem Projekteigentümer eine Rückmeldung bzw. einen Fehler melden wollen, navigieren Sie im Gitlab zunächst zum entsprechenden Projekt.
Anschließend können Sie dann dort die Möglichkeit nutzen, ein neues "Issues" einzureichen.
Ein Anmelden am Portal ist dazu nicht nötig.
</p>
<p>
Wenn Sie darüberhinaus beitragen wollen, befolgen Sie bitte folgende Schritte:
</p>
<ol>
<li>
Melden Sie sich bitte im Portal an. <br>
Sofern Sie noch nicht als Nutzer im Portal eingetragen sind, wird das System Sie durch die Registrierung leiten. <br>
Zur Anmeldung bzw. Registrierung gelangen Sie entweder über das Menü am oberen Seitenrand oder durch Klicken auf diesen <a href="https://m4lab.hft-stuttgart.de/account/"> <i class="fas fa-chevron-right">Link zum Benutzerkonto</i></a>.
</li>
<li>
Folgen Sie dem <a href="https://transfer.hft-stuttgart.de/gitlab/explore/projects"> <i class="fas fa-chevron-right">Link zu den Gitlab-Projekten</i></a>, um zum Gitlab zu gelangen.
</li>
<li>
Fragen Sie beim Projekteigentümer um Zugang, indem Sie im Gitlab bei der entsprechende Projektseite auf den Link <em>Request Access</em> klicken. Solbald dieser ihre Anfrage bestätigt hat, können Sie loslegen.
</li>
</ol>
<h3> <i class="fas fa-question-circle"></i> Möchten Sie selbst ein Projekt anlegen, um es der Öffentlichkeit bereitzustellen? </h3> <!-- text: Hilfestellung zu Gitlab / short help about Gitlab -->
<hr />
</p>
Vorraussetzung dazu ist, dass Sie aktives oder ehemaliges Mitglied der Hochschule für Technik sind, d.h. eine (noch) gültige HFT-Emailadresse haben. <h2>Hilfestellung zu GitLab</h2>
Dann befolgen Sie bitte folgende Schritte:
</p> <br />
<ol> <div class="help">
<li> <div class="card">
Melden Sie sich bitte im Portal an. <br> <div class="card-header">
Sofern Sie noch nicht als Nutzer im Portal eingetragen sind, wird das System Sie durch die Registrierung leiten. <br> <h3 class="card-title">
Zur Anmeldung bzw. Registrierung gelangen Sie entweder über das Menü am oberen Seitenrand oder durch Klicken auf diesen <a href="https://m4lab.hft-stuttgart.de/account/"> <i class="fas fa-chevron-right">Link zum Benutzerkonto</i></a>. <a class="collapsed" data-toggle="collapse" href="#collapse1" aria-expanded="false" aria-controls="collapse1">
</li> Möchten Sie die Projektinhalte ansehen oder herunterladen?</a>
<li> </h3>
Folgen Sie dem <a href="https://transfer.hft-stuttgart.de/gitlab/explore/projects"> <i class="fas fa-chevron-right">Link zu den Gitlab-Projekten</i></a>, um zum Gitlab zu gelangen. </div>
</li> <div id="collapse1" class="card-body collapse">
<li> <p>
Erstellen Sie dann in Gitlab ein neues Projekt durch Klicken auf den grünen <em>New Project</em>-Knopf und anschließendem Befolgen der Eingabemaske von Gitlab. <br> Dann klicken Sie auf diesen
Weitere Hilfestellung zum Anlegen von Projekten in Gitlab finden Sie in der <a href="https://docs.gitlab.com/ee/gitlab-basics/create-project.html"> <i class="fas fa-chevron-right">Gitlab-Dokumentation</i></a>. <a href="https://transfer.hft-stuttgart.de/gitlab/explore/projects"><i class="fas fa-chevron-right">Link zu den Gitlab-Projekten</i></a>
</li> die Liste aller im Gitlab erfassten Projekte zu sehen. Vor dort können Sie dann auf die einzelnen Projekte zugreifen.
</ol> Ein Anmelden am Portal ist dazu nicht nötig.
</p>
<!-- / content body --> </div>
</div> </div>
\ No newline at end of file
<br />
<div class="card">
<div class="card-header">
<h3 class="card-title">
<a class="collapsed" data-toggle="collapse" href="#collapse2" aria-expanded="false" aria-controls="collapse2">
Möchten Sie zu einem Projekt beitragen?</a>
</h3>
</div>
<div id="collapse2" class="card-body collapse">
<p>
Wenn Sie dem Projekteigentümer eine Rückmeldung bzw. einen Fehler melden wollen, navigieren Sie im Gitlab zunächst zum entsprechenden Projekt.
Anschließend können Sie dann dort die Möglichkeit nutzen, ein neues "Issues" einzureichen.
Ein Anmelden am Portal ist dazu nicht nötig.
</p>
<p>
Wenn Sie darüberhinaus beitragen wollen, befolgen Sie bitte folgende Schritte:
</p>
<ol>
<li>
Melden Sie sich bitte im Portal an.
<br />
Sofern Sie noch nicht als Nutzer im Portal eingetragen sind, wird das System Sie durch die Registrierung leiten.
<br />
Zur Anmeldung bzw. Registrierung gelangen Sie entweder über das Menü am oberen Seitenrand oder durch Klicken auf diesen
<a href="https://m4lab.hft-stuttgart.de/account/"> <i class="fas fa-chevron-right">Link zum Benutzerkonto</i></a>.
</li>
<li>
Folgen Sie dem <a href="https://transfer.hft-stuttgart.de/gitlab/explore/projects">
<i class="fas fa-chevron-right">Link zu den Gitlab-Projekten</i></a>, um zum Gitlab zu gelangen.
</li>
<li>
Fragen Sie beim Projekteigentümer um Zugang, indem Sie im Gitlab bei der entsprechende
Projektseite auf den
Link <em>Request Access</em> klicken. Solbald dieser ihre Anfrage bestätigt hat, können
Sie loslegen.
</li>
</ol>
</div>
</div>
<br />
<div class="card">
<div class="card-header">
<h3 class="card-title">
<a class="collapsed" data-toggle="collapse" href="#collapse3" aria-expanded="false" aria-controls="collapse3">
Möchten Sie selbst ein Projekt anlegen, um es der Öffentlichkeit bereitzustellen?</a>
</h3>
</div>
<div id="collapse3" class="card-body collapse">
<p>
Vorraussetzung dazu ist, dass Sie aktives oder ehemaliges Mitglied der Hochschule für Technik sind,
d.h. eine (noch) gültige HFT-Emailadresse haben. Dann befolgen Sie bitte folgende Schritte:
</p>
<ol>
<li>
<p>
Melden Sie sich bitte im Portal an.
<br />
Sofern Sie noch nicht als Nutzer im Portal eingetragen sind, wird das System Sie durch die Registrierung leiten.
<br />
Zur Anmeldung bzw. Registrierung gelangen Sie entweder über das Menü am oberen Seitenrand oder durch Klicken auf diesen
<a href="https://m4lab.hft-stuttgart.de/account/"> <i class="fas fa-chevron-right">Link zum Benutzerkonto</i></a>.
</p>
</li>
<li>
Folgen Sie dem <a href="https://transfer.hft-stuttgart.de/gitlab/explore/projects">
<i class="fas fa-chevron-right">Link zu den Gitlab-Projekten</i></a>, um zum Gitlab zu gelangen.
</li>
<li>
Erstellen Sie dann in Gitlab ein neues Projekt durch Klicken auf den grünen <em>New Project</em>-Knopf und
anschließendem Befolgen der Eingabemaske von Gitlab.
<br />
Weitere Hilfestellung zum Anlegen von Projekten in Gitlab finden Sie in der
<a href="https://docs.gitlab.com/ee/gitlab-basics/create-project.html"> <i class="fas fa-chevron-right">Gitlab-Dokumentation</i></a>.
</li>
</ol>
</div>
</div>
</div>
<hr />
<!-- / content body -->
</div>
\ No newline at end of file
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment