From f42e90490c84ccb43dcfa7cb1b2f659b6f7dd546 Mon Sep 17 00:00:00 2001 From: Rosanny <rosanny.sihombing@hft-stuttgart.de> Date: Wed, 6 Jul 2022 15:32:46 +0200 Subject: [PATCH] add compiled codes --- built/app.js | 7 + built/classes/project.js | 3 + built/classes/repo.js | 1 + built/classes/user.js | 7 + built/classes/website.js | 1 + built/config/config.js | 22 ++ built/config/const.js | 1 + built/config/dbconn.js | 2 + built/config/mailer.js | 1 + built/controller/dbController.js | 14 ++ built/controller/gitlabController.js | 2 + built/controller/publicController.js | 9 + built/public/default/logo.png | Bin 0 -> 86689 bytes built/public/js/generalFunction.js | 9 + built/public/js/headfoot.js | 224 +++++++++++++++++ built/public/js/headfootLogout.js | 237 ++++++++++++++++++ built/public/js/registration.js | 37 +++ built/public/js/security.js | 30 +++ built/routes/account.js | 12 + built/routes/cert/cert.pem | 33 +++ built/routes/cert/cert_idp.pem | 1 + built/routes/cert/key.pem | 3 + built/routes/public.js | 7 + built/views/DE/404.pug | 30 +++ built/views/DE/500.pug | 31 +++ built/views/DE/account/contact.pug | 56 +++++ built/views/DE/account/forgotPwd.pug | 36 +++ built/views/DE/account/home.pug | 75 ++++++ built/views/DE/account/newInformation.pug | 123 +++++++++ built/views/DE/account/profile.pug | 112 +++++++++ built/views/DE/account/registration.pug | 85 +++++++ built/views/DE/account/reset.pug | 42 ++++ built/views/DE/account/security.pug | 94 +++++++ built/views/DE/account/services.pug | 101 ++++++++ built/views/DE/account/updateInformation.pug | 156 ++++++++++++ built/views/DE/account/verification.pug | 36 +++ .../DE/project/updateProjectOverview.pug | 0 built/views/EN/404.pug | 4 + built/views/EN/500.pug | 8 + built/views/EN/account/forgotPwd.pug | 56 +++++ built/views/EN/account/home.pug | 49 ++++ built/views/EN/account/profile.pug | 95 +++++++ built/views/EN/account/registration.pug | 92 +++++++ built/views/EN/account/reset.pug | 60 +++++ built/views/EN/account/security.pug | 94 +++++++ built/views/EN/account/services.pug | 77 ++++++ 46 files changed, 2175 insertions(+) create mode 100644 built/app.js create mode 100644 built/classes/project.js create mode 100644 built/classes/repo.js create mode 100644 built/classes/user.js create mode 100644 built/classes/website.js create mode 100644 built/config/config.js create mode 100644 built/config/const.js create mode 100644 built/config/dbconn.js create mode 100644 built/config/mailer.js create mode 100644 built/controller/dbController.js create mode 100644 built/controller/gitlabController.js create mode 100644 built/controller/publicController.js create mode 100644 built/public/default/logo.png create mode 100644 built/public/js/generalFunction.js create mode 100644 built/public/js/headfoot.js create mode 100644 built/public/js/headfootLogout.js create mode 100644 built/public/js/registration.js create mode 100644 built/public/js/security.js create mode 100644 built/routes/account.js create mode 100644 built/routes/cert/cert.pem create mode 100644 built/routes/cert/cert_idp.pem create mode 100644 built/routes/cert/key.pem create mode 100644 built/routes/public.js create mode 100644 built/views/DE/404.pug create mode 100644 built/views/DE/500.pug create mode 100644 built/views/DE/account/contact.pug create mode 100644 built/views/DE/account/forgotPwd.pug create mode 100644 built/views/DE/account/home.pug create mode 100644 built/views/DE/account/newInformation.pug create mode 100644 built/views/DE/account/profile.pug create mode 100644 built/views/DE/account/registration.pug create mode 100644 built/views/DE/account/reset.pug create mode 100644 built/views/DE/account/security.pug create mode 100644 built/views/DE/account/services.pug create mode 100644 built/views/DE/account/updateInformation.pug create mode 100644 built/views/DE/account/verification.pug create mode 100644 built/views/DE/project/updateProjectOverview.pug create mode 100644 built/views/EN/404.pug create mode 100644 built/views/EN/500.pug create mode 100644 built/views/EN/account/forgotPwd.pug create mode 100644 built/views/EN/account/home.pug create mode 100644 built/views/EN/account/profile.pug create mode 100644 built/views/EN/account/registration.pug create mode 100644 built/views/EN/account/reset.pug create mode 100644 built/views/EN/account/security.pug create mode 100644 built/views/EN/account/services.pug diff --git a/built/app.js b/built/app.js new file mode 100644 index 00000000..4d73b754 --- /dev/null +++ b/built/app.js @@ -0,0 +1,7 @@ +"use strict";var _process$env$NODE_ENV,_express=_interopRequireDefault(require("express")),_path=_interopRequireDefault(require("path")),_passport=_interopRequireDefault(require("passport")),_morgan=_interopRequireDefault(require("morgan")),_cookieParser=_interopRequireDefault(require("cookie-parser")),_bodyParser=_interopRequireDefault(require("body-parser")),_expressSession=_interopRequireDefault(require("express-session")),_expressFlash=_interopRequireDefault(require("express-flash-2")),_expressFileupload=_interopRequireDefault(require("express-fileupload")),_helmet=_interopRequireDefault(require("helmet")),_compression=_interopRequireDefault(require("compression")),_methodOverride=_interopRequireDefault(require("method-override"));function _interopRequireDefault(a){return a&&a.__esModule?a:{default:a}}var env=null!==(_process$env$NODE_ENV=process.env.NODE_ENV)&&void 0!==_process$env$NODE_ENV?_process$env$NODE_ENV:"testing",config=require("./config/config")[env],lang="DE",app=(0,_express["default"])();// enable files upload +// caching disabled for every route +// NOTE: Works in Firefox and Opera. Does not work in Edge +// Handle 404 +// Handle 500 - any server error +app.set("port",config.app.port),app.set("views",_path["default"].join(_path["default"].join(__dirname,"/views"))),app.set("view engine","pug"),app.use((0,_expressFileupload["default"])({createParentPath:!0,limits:{fileSize:1e6// 1 MB max. file size +}})),app.use((0,_methodOverride["default"])("_method")),app.use(_helmet["default"].contentSecurityPolicy({useDefaults:!0,directives:{"font-src":["'self'","https://use.fontawesome.com"],"img-src":["'self'","https://transfer.hft-stuttgart.de"],"script-src":["'self'","https://code.jquery.com/jquery-3.3.1.min.js","https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js","https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js","https://unpkg.com/bootstrap-show-password@1.2.1/dist/bootstrap-show-password.min.js"],"style-src":["'self'","https://use.fontawesome.com/releases/v5.8.2/css/all.css"],"frame-src":["'self'"]},reportOnly:!0})),app.use((0,_compression["default"])()),app.use((0,_morgan["default"])("combined")),app.use((0,_cookieParser["default"])(config.app.sessionSecret)),app.use(_bodyParser["default"].json()),app.use(_bodyParser["default"].urlencoded({extended:!1})),app.use(_express["default"]["static"](_path["default"].join(__dirname,"public"))),app.use(function(a,b,c){c()}),app.use((0,_expressSession["default"])({resave:!0,saveUninitialized:!0,secret:config.app.sessionSecret})),app.use((0,_expressFlash["default"])()),app.use(_passport["default"].initialize()),app.use(_passport["default"].session()),app.use(function(a,b,c){b.set("Cache-Control","no-cache, private, no-store, must-revalidate, max-stale=0, post-check=0, pre-check=0"),c()}),require("./routes/public")(app,config,lang),require("./routes/account")(app,config,_passport["default"],lang),app.use(function(a,b){b.status(404).render(lang+"/404")}),app.use(function(a,b,c){console.error(a.stack),c.status(500).render(lang+"/500",{error:a})}),app.listen(app.get("port"),function(){console.log("Express server listening on port "+app.get("port"))}); \ No newline at end of file diff --git a/built/classes/project.js b/built/classes/project.js new file mode 100644 index 00000000..6f678d7b --- /dev/null +++ b/built/classes/project.js @@ -0,0 +1,3 @@ +"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.Project=void 0;function _classCallCheck(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}function _defineProperties(a,b){for(var c,d=0;d<b.length;d++)c=b[d],c.enumerable=c.enumerable||!1,c.configurable=!0,"value"in c&&(c.writable=!0),Object.defineProperty(a,c.key,c)}function _createClass(a,b,c){return b&&_defineProperties(a.prototype,b),c&&_defineProperties(a,c),Object.defineProperty(a,"prototype",{writable:!1}),a}var Project=/*#__PURE__*/function(){function a(b,c,d,e,f,g){_classCallCheck(this,a),this.ownerGitlabId=b,this.name=c,this.desc=d,this.id=e,this.logo=f,this.path=g}// getter +return _createClass(a,[{key:"getOwnerGitlabId",value:function getOwnerGitlabId(){return this.ownerGitlabId}},{key:"getId",value:function getId(){return this.id}},{key:"getName",value:function getName(){return this.name}},{key:"getDesc",value:function getDesc(){return this.desc}},{key:"getLogo",value:function getLogo(){return this.logo}},{key:"getPath",value:function getPath(){return this.path}// setter +},{key:"setOwnerGitlabId",value:function setOwnerGitlabId(a){this.ownerGitlabId=a}},{key:"setId",value:function setId(a){this.id=a}},{key:"setName",value:function setName(a){this.name=a}},{key:"setDesc",value:function setDesc(a){this.desc=a}},{key:"setLogo",value:function setLogo(a){this.logo=a}},{key:"setPath",value:function setPath(a){this.path=a}}]),a}();exports.Project=Project; \ No newline at end of file diff --git a/built/classes/repo.js b/built/classes/repo.js new file mode 100644 index 00000000..145d184c --- /dev/null +++ b/built/classes/repo.js @@ -0,0 +1 @@ +"use strict";var _project=require("./project");function _typeof(a){"@babel/helpers - typeof";return _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(a){return typeof a}:function(a){return a&&"function"==typeof Symbol&&a.constructor===Symbol&&a!==Symbol.prototype?"symbol":typeof a},_typeof(a)}Object.defineProperty(exports,"__esModule",{value:!0}),exports.Repo=void 0;function _defineProperties(a,b){for(var c,d=0;d<b.length;d++)c=b[d],c.enumerable=c.enumerable||!1,c.configurable=!0,"value"in c&&(c.writable=!0),Object.defineProperty(a,c.key,c)}function _createClass(a,b,c){return b&&_defineProperties(a.prototype,b),c&&_defineProperties(a,c),Object.defineProperty(a,"prototype",{writable:!1}),a}function _classCallCheck(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}function _inherits(a,b){if("function"!=typeof b&&null!==b)throw new TypeError("Super expression must either be null or a function");a.prototype=Object.create(b&&b.prototype,{constructor:{value:a,writable:!0,configurable:!0}}),Object.defineProperty(a,"prototype",{writable:!1}),b&&_setPrototypeOf(a,b)}function _setPrototypeOf(a,b){return _setPrototypeOf=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(a,b){return a.__proto__=b,a},_setPrototypeOf(a,b)}function _createSuper(a){var b=_isNativeReflectConstruct();return function(){var c,d=_getPrototypeOf(a);if(b){var e=_getPrototypeOf(this).constructor;c=Reflect.construct(d,arguments,e)}else c=d.apply(this,arguments);return _possibleConstructorReturn(this,c)}}function _possibleConstructorReturn(a,b){if(b&&("object"===_typeof(b)||"function"==typeof b))return b;if(void 0!==b)throw new TypeError("Derived constructors may only return object or undefined");return _assertThisInitialized(a)}function _assertThisInitialized(a){if(void 0===a)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return a}function _isNativeReflectConstruct(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch(a){return!1}}function _getPrototypeOf(a){return _getPrototypeOf=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(a){return a.__proto__||Object.getPrototypeOf(a)},_getPrototypeOf(a)}var Repo=/*#__PURE__*/function(a){function b(a,d,e,f,g,h){return _classCallCheck(this,b),c.call(this,a,d,e,f,g,h)}_inherits(b,a);var c=_createSuper(b);return _createClass(b)}(_project.Project);exports.Repo=Repo; \ No newline at end of file diff --git a/built/classes/user.js b/built/classes/user.js new file mode 100644 index 00000000..fa381835 --- /dev/null +++ b/built/classes/user.js @@ -0,0 +1,7 @@ +"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.User=void 0;function _classCallCheck(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}function _defineProperties(a,b){for(var c,d=0;d<b.length;d++)c=b[d],c.enumerable=c.enumerable||!1,c.configurable=!0,"value"in c&&(c.writable=!0),Object.defineProperty(a,c.key,c)}function _createClass(a,b,c){return b&&_defineProperties(a.prototype,b),c&&_defineProperties(a,c),Object.defineProperty(a,"prototype",{writable:!1}),a}var User=/*#__PURE__*/function(){// should be enum +// should be enum +// 1 or 0 +// 1 or 0 - // should be boolean +function a(b,c,d,e,f,g,h,i,j,k,l,m){_classCallCheck(this,a),this.id=b,this.email=c,this.salutation=d,this.title=e,this.firstName=f,this.lastName=g,this.industry=h,this.organisation=i,this.speciality=j,this.isM4labIdp=k,this.verificationStatus=l,this.gitlabUserId=m}// getter +return _createClass(a,[{key:"getId",value:function getId(){return this.id}},{key:"getEmail",value:function getEmail(){return this.email}},{key:"getFullName",value:function getFullName(){return this.firstName+" "+this.lastName}},{key:"getIdpStatus",value:function getIdpStatus(){return this.isM4labIdp}},{key:"getVerificationStatus",value:function getVerificationStatus(){return this.verificationStatus}},{key:"getGitlabUserId",value:function getGitlabUserId(){return this.gitlabUserId}// setter +},{key:"setEmail",value:function setEmail(a){this.email=a}},{key:"setSalutation",value:function setSalutation(a){this.salutation=a}},{key:"setTitle",value:function setTitle(a){this.title=a}},{key:"setFirstName",value:function setFirstName(a){this.firstName=a}},{key:"setLastName",value:function setLastName(a){this.lastName=a}},{key:"setIndustry",value:function setIndustry(a){this.industry=a}},{key:"setOrganisation",value:function setOrganisation(a){this.organisation=a}},{key:"setSpeciality",value:function setSpeciality(a){this.speciality=a}},{key:"setM4lab_idp",value:function setM4lab_idp(a){this.isM4labIdp=a}},{key:"setVerificationStatus",value:function setVerificationStatus(a){this.verificationStatus=a}},{key:"setGitlabUserId",value:function setGitlabUserId(a){this.gitlabUserId=a}},{key:"updateProfile",value:function updateProfile(a,b,c,d,e,f,g,h){this.salutation=a,this.title=b,this.firstName=c,this.lastName=d,this.email=e,this.organisation=f,this.industry=g,this.speciality=h}}]),a}();exports.User=User; \ No newline at end of file diff --git a/built/classes/website.js b/built/classes/website.js new file mode 100644 index 00000000..16066986 --- /dev/null +++ b/built/classes/website.js @@ -0,0 +1 @@ +"use strict";var _project=require("./project");function _typeof(a){"@babel/helpers - typeof";return _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(a){return typeof a}:function(a){return a&&"function"==typeof Symbol&&a.constructor===Symbol&&a!==Symbol.prototype?"symbol":typeof a},_typeof(a)}Object.defineProperty(exports,"__esModule",{value:!0}),exports.Website=void 0;function _defineProperties(a,b){for(var c,d=0;d<b.length;d++)c=b[d],c.enumerable=c.enumerable||!1,c.configurable=!0,"value"in c&&(c.writable=!0),Object.defineProperty(a,c.key,c)}function _createClass(a,b,c){return b&&_defineProperties(a.prototype,b),c&&_defineProperties(a,c),Object.defineProperty(a,"prototype",{writable:!1}),a}function _classCallCheck(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}function _inherits(a,b){if("function"!=typeof b&&null!==b)throw new TypeError("Super expression must either be null or a function");a.prototype=Object.create(b&&b.prototype,{constructor:{value:a,writable:!0,configurable:!0}}),Object.defineProperty(a,"prototype",{writable:!1}),b&&_setPrototypeOf(a,b)}function _setPrototypeOf(a,b){return _setPrototypeOf=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(a,b){return a.__proto__=b,a},_setPrototypeOf(a,b)}function _createSuper(a){var b=_isNativeReflectConstruct();return function(){var c,d=_getPrototypeOf(a);if(b){var e=_getPrototypeOf(this).constructor;c=Reflect.construct(d,arguments,e)}else c=d.apply(this,arguments);return _possibleConstructorReturn(this,c)}}function _possibleConstructorReturn(a,b){if(b&&("object"===_typeof(b)||"function"==typeof b))return b;if(void 0!==b)throw new TypeError("Derived constructors may only return object or undefined");return _assertThisInitialized(a)}function _assertThisInitialized(a){if(void 0===a)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return a}function _isNativeReflectConstruct(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch(a){return!1}}function _getPrototypeOf(a){return _getPrototypeOf=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(a){return a.__proto__||Object.getPrototypeOf(a)},_getPrototypeOf(a)}var Website=/*#__PURE__*/function(a){function b(a,d,e,f,g,h){return _classCallCheck(this,b),c.call(this,a,d,e,f,g,h)}_inherits(b,a);var c=_createSuper(b);return _createClass(b)}(_project.Project);exports.Website=Website; \ No newline at end of file diff --git a/built/config/config.js b/built/config/config.js new file mode 100644 index 00000000..e04c4ea8 --- /dev/null +++ b/built/config/config.js @@ -0,0 +1,22 @@ +"use strict";var _process$env$PORT,_process$env$SAML_PAT,_process$env$PORT2,_process$env$SAML_PAT2,_process$env$SAML_ENT;Object.defineProperty(exports,"__esModule",{value:!0});module.exports={development:{app:{name:"User Account Management",port:null!==(_process$env$PORT=process.env.PORT)&&void 0!==_process$env$PORT?_process$env$PORT:9989,host:"http://localhost:9989",sessionSecret:"thisisasecret"},passport:{strategy:"saml",saml:{path:null!==(_process$env$SAML_PAT=process.env.SAML_PATH)&&void 0!==_process$env$SAML_PAT?_process$env$SAML_PAT:"/saml/SSO",entryPoint:process.env.SAML_ENTRY_POINT||"saml entry point",issuer:"SAML issuer",logoutUrl:"SAML logout URL"}},database:{host:"localhost",// DB host +user:"dbuser",// DB username +password:"dbpass",// DB password +port:3306,// MySQL port +dbUser:"userdb",// User DB +host_project:"localhost",// DB host project db +dbProject:"projectdb"// Project DB +},mailer:{host:"mailhost",// hostname +secureConnection:!1,// TLS requires secureConnection to be false +port:587,// port for secure SMTP +TLS:!0,authUser:"mailuser",authPass:"mailpass",tlsCiphers:"SSLv3",from:"mailfrom"},gitlab:{token_readWriteProjects:"token-goes-here"}},testing:{app:{name:"User Account Management",port:null!==(_process$env$PORT2=process.env.PORT)&&void 0!==_process$env$PORT2?_process$env$PORT2:9989,host:"https://m4lab.hft-stuttgart.de/account",sessionSecret:"thisisasecret"},passport:{strategy:"saml",saml:{path:null!==(_process$env$SAML_PAT2=process.env.SAML_PATH)&&void 0!==_process$env$SAML_PAT2?_process$env$SAML_PAT2:"/saml/SSO",entryPoint:null!==(_process$env$SAML_ENT=process.env.SAML_ENTRY_POINT)&&void 0!==_process$env$SAML_ENT?_process$env$SAML_ENT:"saml entry point",issuer:"SAML issuer",// testing metadata +logoutUrl:"SAML logout URL"}},database:{host:"dbhost",// DB host +user:"dbuser",// DB username +password:"dbpass",// DB password +port:3306,// MySQL port +dbUser:"userdb",// User DB +host_project:"dbhost",// DB host project db +dbProject:"projectdb"// Project DB +},mailer:{host:"mailhost",// hostname +secureConnection:!1,// TLS requires secureConnection to be false +port:587,// port for secure SMTP +TLS:!0,authUser:"mailuser",authPass:"mailpass",tlsCiphers:"SSLv3",from:"mailfrom"},gitlab:{token_readWriteProjects:"token-goes-here"}}}; \ No newline at end of file diff --git a/built/config/const.js b/built/config/const.js new file mode 100644 index 00000000..48f80a01 --- /dev/null +++ b/built/config/const.js @@ -0,0 +1 @@ +"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.miscConst=void 0;var miscConst={mailSignature:"Mit den besten Gr\xFC\xDFen,<br/>das Transferportal-Team der HFT Stuttgart<br/><br/>Transferportal der Hochschule f\xFCr Technik Stuttgart<br/>Schellingstr. 24 70174 Stuttgart<br/>m4lab@hft-stuttgart.de<br/><a mailConsthref=\"https://transfer.hft-stuttgart.de\">https://transfer.hft-stuttgart.de</a><br/><a href=\"http://www.hft-stuttgart.de/Aktuell/\"><img border=\"0\" alt=\"HFT\" src=\"https://m4lab.hft-stuttgart.de/img/signature/hft_logo.png\" width=\"30\" height=\"30\"></a> <a href=\"http://www.facebook.com/hftstuttgart\"><img border=\"0\" alt=\"Facebook\" src=\"https://m4lab.hft-stuttgart.de/img/signature/fb_bw.png\" width=\"30\" height=\"30\"></a> <a href=\"https://www.instagram.com/hft_stuttgart/\"><img border=\"0\" alt=\"Instagram\" src=\"https://m4lab.hft-stuttgart.de/img/signature/instagram_bw.png\" width=\"30\" height=\"30\"></a> <a href=\"https://twitter.com/hft_presse\"><img border=\"0\" alt=\"Twitter\" src=\"https://m4lab.hft-stuttgart.de/img/signature/twitter_bw.png\" width=\"30\" height=\"30\"></a> <a href=\"https://www.youtube.com/channel/UCi0_JfF2qMZbOhOnNH5PyHA\"><img border=\"0\" alt=\"Youtube\" src=\"https://m4lab.hft-stuttgart.de/img/signature/youtube_bw.png\" width=\"30\" height=\"30\"></a> <a href=\"http://www.hft-stuttgart.de/Aktuell/Presse-Marketing/SocialMedia/Snapcode HFT_Stuttgart.jpg/photo_view\"><img border=\"0\" alt=\"Snapchat\" src=\"https://m4lab.hft-stuttgart.de/img/signature/snapchat_bw.png\" width=\"30\" height=\"30\"></a><br/><img border=\"0\" src=\"https://m4lab.hft-stuttgart.de/img/signature/inno_bw.png\" width=\"150\" height=\"100\">",updatePasswordMailSubject:"Ihr Passwort f\xFCr das Transferportal wurde gespeichert.",updatePasswordMailContent:"<div>Lieber Nutzer,<br/><br/>Ihr Passwort wurde erfolgreich ge\xE4ndert.<br/><br/></div>"};exports.miscConst=miscConst; \ No newline at end of file diff --git a/built/config/dbconn.js b/built/config/dbconn.js new file mode 100644 index 00000000..1fc0ed1b --- /dev/null +++ b/built/config/dbconn.js @@ -0,0 +1,2 @@ +"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.dbConnection=void 0;var _process$env$NODE_ENV,_mysql=_interopRequireDefault(require("mysql2"));function _interopRequireDefault(a){return a&&a.__esModule?a:{default:a}}var env=null!==(_process$env$NODE_ENV=process.env.NODE_ENV)&&void 0!==_process$env$NODE_ENV?_process$env$NODE_ENV:"testing",config=require("./config")[env],userConnection=_mysql["default"].createPool({host:config.database.host,user:config.database.user,password:config.database.password,port:config.database.port,database:config.database.dbUser,waitForConnections:!0,connectionLimit:10,queueLimit:0});userConnection.query("USE "+config.database.dbUser);// ==== PROJECT DB CONNECTION ==== +var projectConnection=_mysql["default"].createPool({host:config.database.host_project,user:config.database.user,password:config.database.password,port:config.database.port,database:config.database.dbProject,waitForConnections:!0,connectionLimit:10,queueLimit:0});projectConnection.query("USE "+config.database.dbProject);var dbConnection={user:userConnection,project:projectConnection};exports.dbConnection=dbConnection; \ No newline at end of file diff --git a/built/config/mailer.js b/built/config/mailer.js new file mode 100644 index 00000000..505d4c35 --- /dev/null +++ b/built/config/mailer.js @@ -0,0 +1 @@ +"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.mailer=void 0;var _process$env$NODE_ENV,nodemailer=require("nodemailer"),nodemailerNTLMAuth=require("nodemailer-ntlm-auth"),env=null!==(_process$env$NODE_ENV=process.env.NODE_ENV)&&void 0!==_process$env$NODE_ENV?_process$env$NODE_ENV:"testing",config=require("./config")[env],smtpTransporter=nodemailer.createTransport({host:config.mailer.host,secure:config.mailer.secureConnection,port:config.mailer.port,requireTLS:config.mailer.TLS,auth:{type:"custom",method:"NTLM",user:config.mailer.authUser,pass:config.mailer.authPass,options:{domain:"ad"}},customAuth:{NTLM:nodemailerNTLMAuth}}),mailOptions={to:"",cc:"",from:config.mailer.from,subject:"",text:"",html:""},mailer={transporter:smtpTransporter,options:mailOptions};exports.mailer=mailer; \ No newline at end of file diff --git a/built/controller/dbController.js b/built/controller/dbController.js new file mode 100644 index 00000000..c38b8592 --- /dev/null +++ b/built/controller/dbController.js @@ -0,0 +1,14 @@ +"use strict";var _dbconn=require("../config/dbconn");function _typeof(a){"@babel/helpers - typeof";return _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(a){return typeof a}:function(a){return a&&"function"==typeof Symbol&&a.constructor===Symbol&&a!==Symbol.prototype?"symbol":typeof a},_typeof(a)}Object.defineProperty(exports,"__esModule",{value:!0}),exports.dbController=void 0;function _regeneratorRuntime(){"use strict";/*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */function a(a,b,c){return Object.defineProperty(a,b,{value:c,enumerable:!0,configurable:!0,writable:!0}),a[b]}function b(a,b,e,f){var g=b&&b.prototype instanceof d?b:d,h=Object.create(g.prototype),j=new l(f||[]);return h._invoke=function(a,b,d){var e="suspendedStart";return function(f,g){if("executing"===e)throw new Error("Generator is already running");if("completed"===e){if("throw"===f)throw g;return n()}for(d.method=f,d.arg=g;;){var h=d.delegate;if(h){var j=i(h,d);if(j){if(j===v)continue;return j}}if("next"===d.method)d.sent=d._sent=d.arg;else if("throw"===d.method){if("suspendedStart"===e)throw e="completed",d.arg;d.dispatchException(d.arg)}else"return"===d.method&&d.abrupt("return",d.arg);e="executing";var k=c(a,b,d);if("normal"===k.type){if(e=d.done?"completed":"suspendedYield",k.arg===v)continue;return{value:k.arg,done:d.done}}"throw"===k.type&&(e="completed",d.method="throw",d.arg=k.arg)}}}(a,e,j),h}function c(a,b,c){try{return{type:"normal",arg:a.call(b,c)}}catch(a){return{type:"throw",arg:a}}}function d(){}function e(){}function f(){}function g(b){["next","throw","return"].forEach(function(c){a(b,c,function(a){return this._invoke(c,a)})})}function h(a,b){function d(e,f,g,h){var i=c(a[e],a,f);if("throw"!==i.type){var j=i.arg,k=j.value;return k&&"object"==_typeof(k)&&q.call(k,"__await")?b.resolve(k.__await).then(function(a){d("next",a,g,h)},function(a){d("throw",a,g,h)}):b.resolve(k).then(function(a){j.value=a,g(j)},function(a){return d("throw",a,g,h)})}h(i.arg)}var e;this._invoke=function(a,c){function f(){return new b(function(b,e){d(a,c,b,e)})}return e=e?e.then(f,f):f()}}function i(a,b){var d=a.iterator[b.method];if(void 0===d){if(b.delegate=null,"throw"===b.method){if(a.iterator["return"]&&(b.method="return",b.arg=void 0,i(a,b),"throw"===b.method))return v;b.method="throw",b.arg=new TypeError("The iterator does not provide a 'throw' method")}return v}var e=c(d,a.iterator,b.arg);if("throw"===e.type)return b.method="throw",b.arg=e.arg,b.delegate=null,v;var f=e.arg;return f?f.done?(b[a.resultName]=f.value,b.next=a.nextLoc,"return"!==b.method&&(b.method="next",b.arg=void 0),b.delegate=null,v):f:(b.method="throw",b.arg=new TypeError("iterator result is not an object"),b.delegate=null,v)}function j(a){var b={tryLoc:a[0]};1 in a&&(b.catchLoc=a[1]),2 in a&&(b.finallyLoc=a[2],b.afterLoc=a[3]),this.tryEntries.push(b)}function k(a){var b=a.completion||{};b.type="normal",delete b.arg,a.completion=b}function l(a){this.tryEntries=[{tryLoc:"root"}],a.forEach(j,this),this.reset(!0)}function m(a){if(a){var b=a[s];if(b)return b.call(a);if("function"==typeof a.next)return a;if(!isNaN(a.length)){var c=-1,d=function b(){for(;++c<a.length;)if(q.call(a,c))return b.value=a[c],b.done=!1,b;return b.value=void 0,b.done=!0,b};return d.next=d}}return{next:n}}function n(){return{value:void 0,done:!0}}_regeneratorRuntime=function(){return o};var o={},p=Object.prototype,q=p.hasOwnProperty,r="function"==typeof Symbol?Symbol:{},s=r.iterator||"@@iterator",t=r.asyncIterator||"@@asyncIterator",u=r.toStringTag||"@@toStringTag";try{a({},"")}catch(b){a=function(a,b,c){return a[b]=c}}o.wrap=b;var v={},w={};a(w,s,function(){return this});var x=Object.getPrototypeOf,y=x&&x(x(m([])));y&&y!==p&&q.call(y,s)&&(w=y);var z=f.prototype=d.prototype=Object.create(w);return e.prototype=f,a(z,"constructor",f),a(f,"constructor",e),e.displayName=a(f,u,"GeneratorFunction"),o.isGeneratorFunction=function(a){var b="function"==typeof a&&a.constructor;return!!b&&(b===e||"GeneratorFunction"===(b.displayName||b.name))},o.mark=function(b){return Object.setPrototypeOf?Object.setPrototypeOf(b,f):(b.__proto__=f,a(b,u,"GeneratorFunction")),b.prototype=Object.create(z),b},o.awrap=function(a){return{__await:a}},g(h.prototype),a(h.prototype,t,function(){return this}),o.AsyncIterator=h,o.async=function(a,c,d,e,f){void 0===f&&(f=Promise);var g=new h(b(a,c,d,e),f);return o.isGeneratorFunction(c)?g:g.next().then(function(a){return a.done?a.value:g.next()})},g(z),a(z,u,"Generator"),a(z,s,function(){return this}),a(z,"toString",function(){return"[object Generator]"}),o.keys=function(a){var b=[];for(var c in a)b.push(c);return b.reverse(),function c(){for(;b.length;){var d=b.pop();if(d in a)return c.value=d,c.done=!1,c}return c.done=!0,c}},o.values=m,l.prototype={constructor:l,reset:function reset(a){if(this.prev=0,this.next=0,this.sent=this._sent=void 0,this.done=!1,this.delegate=null,this.method="next",this.arg=void 0,this.tryEntries.forEach(k),!a)for(var b in this)"t"===b.charAt(0)&&q.call(this,b)&&!isNaN(+b.slice(1))&&(this[b]=void 0)},stop:function stop(){this.done=!0;var a=this.tryEntries[0].completion;if("throw"===a.type)throw a.arg;return this.rval},dispatchException:function dispatchException(a){function b(b,d){return f.type="throw",f.arg=a,c.next=b,d&&(c.method="next",c.arg=void 0),!!d}if(this.done)throw a;for(var c=this,d=this.tryEntries.length-1;0<=d;--d){var e=this.tryEntries[d],f=e.completion;if("root"===e.tryLoc)return b("end");if(e.tryLoc<=this.prev){var g=q.call(e,"catchLoc"),h=q.call(e,"finallyLoc");if(g&&h){if(this.prev<e.catchLoc)return b(e.catchLoc,!0);if(this.prev<e.finallyLoc)return b(e.finallyLoc)}else if(!g){if(!h)throw new Error("try statement without catch or finally");if(this.prev<e.finallyLoc)return b(e.finallyLoc)}else if(this.prev<e.catchLoc)return b(e.catchLoc,!0)}}},abrupt:function abrupt(a,b){for(var c,d=this.tryEntries.length-1;0<=d;--d)if(c=this.tryEntries[d],c.tryLoc<=this.prev&&q.call(c,"finallyLoc")&&this.prev<c.finallyLoc){var e=c;break}e&&("break"===a||"continue"===a)&&e.tryLoc<=b&&b<=e.finallyLoc&&(e=null);var f=e?e.completion:{};return f.type=a,f.arg=b,e?(this.method="next",this.next=e.finallyLoc,v):this.complete(f)},complete:function complete(a,b){if("throw"===a.type)throw a.arg;return"break"===a.type||"continue"===a.type?this.next=a.arg:"return"===a.type?(this.rval=this.arg=a.arg,this.method="return",this.next="end"):"normal"===a.type&&b&&(this.next=b),v},finish:function finish(a){for(var b,c=this.tryEntries.length-1;0<=c;--c)if(b=this.tryEntries[c],b.finallyLoc===a)return this.complete(b.completion,b.afterLoc),k(b),v},catch:function _catch(a){for(var b,c=this.tryEntries.length-1;0<=c;--c)if(b=this.tryEntries[c],b.tryLoc===a){var d=b.completion;if("throw"===d.type){var e=d.arg;k(b)}return e}throw new Error("illegal catch attempt")},delegateYield:function delegateYield(a,b,c){return this.delegate={iterator:m(a),resultName:b,nextLoc:c},"next"===this.method&&(this.arg=void 0),v}},o}function asyncGeneratorStep(a,b,c,d,e,f,g){try{var h=a[f](g),i=h.value}catch(a){return void c(a)}h.done?b(i):Promise.resolve(i).then(d,e)}function _asyncToGenerator(a){return function(){var b=this,c=arguments;return new Promise(function(d,e){function f(a){asyncGeneratorStep(h,d,e,f,g,"next",a)}function g(a){asyncGeneratorStep(h,d,e,f,g,"throw",a)}var h=a.apply(b,c);f(void 0)})}}var dbController={// ===================== user db ===================== +registerNewUser:function registerNewUser(a,b){_dbconn.dbConnection.user.getConnection(function(c,d){d.beginTransaction(function(b){// START TRANSACTION +if(b)throw b;// insert profile +d.query("INSERT INTO user SET ?",a.profile,function(b,c){if(b)return d.rollback(function(){throw b});var e=c.insertId,f={user_id:e,password:a.password};// set password +d.query("INSERT INTO credential SET ?",f,function(b){if(b)return d.rollback(function(){throw b});// set default user-project-role +d.query("INSERT INTO user_project_role SET ?",{project_id:1,// M4_LAB +role_id:2,// USER +user_id:e},function(b){if(b)return d.rollback(function(){throw b});// MLAB-129: INSERT verification token +var c={user_id:e,token:a.verificationToken};d.query("INSERT INTO verification SET ?",c,function(a){return a?d.rollback(function(){throw a}):void// COMMIT +d.commit(function(a){if(a)return d.rollback(function(){throw a})})})})})})}),b(c)})},getUserByEmail:function(){function a(){return b.apply(this,arguments)}var b=_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function b(a){var c;return _regeneratorRuntime().wrap(function d(b){for(;1;)switch(b.prev=b.next){case 0:return b.prev=0,b.next=3,_dbconn.dbConnection.user.promise().query("SELECT id, verificationStatus, salutation, title, firstname, lastname, industry, organisation, speciality, m4lab_idp FROM user WHERE email = \""+a+"\"");case 3:if(c=b.sent,!c[0][0]){b.next=8;break}return b.abrupt("return",c[0][0]);case 8:return b.abrupt("return",null);case 9:b.next=14;break;case 11:b.prev=11,b.t0=b["catch"](0),console.error(b.t0);case 14:return b.abrupt("return",null);case 15:case"end":return b.stop();}},b,null,[[0,11]])}));return a}(),getUserEmailById:function(){function a(a){return b.apply(this,arguments)}var b=_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function b(a){var c;return _regeneratorRuntime().wrap(function d(b){for(;1;)switch(b.prev=b.next){case 0:return b.prev=0,b.next=3,_dbconn.dbConnection.user.promise().query("SELECT email FROM user WHERE id = "+a);case 3:if(c=b.sent,!c[0][0]){b.next=8;break}return b.abrupt("return",c[0][0].email);case 8:return b.abrupt("return",null);case 9:b.next=14;break;case 11:b.prev=11,b.t0=b["catch"](0),console.error(b.t0);case 14:return b.abrupt("return",null);case 15:case"end":return b.stop();}},b,null,[[0,11]])}));return a}(),checkUserEmail:function(){function a(a){return b.apply(this,arguments)}var b=_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function b(a){var c;return _regeneratorRuntime().wrap(function d(b){for(;1;)switch(b.prev=b.next){case 0:return b.prev=0,b.next=3,_dbconn.dbConnection.user.promise().query("SELECT id, email FROM user WHERE email = \""+a+"\"");case 3:if(c=b.sent,!c[0][0]){b.next=8;break}return b.abrupt("return",c[0][0]);case 8:return b.abrupt("return",null);case 9:b.next=14;break;case 11:b.prev=11,b.t0=b["catch"](0),console.error(b.t0);case 14:return b.abrupt("return",null);case 15:case"end":return b.stop();}},b,null,[[0,11]])}));return a}(),getUserByToken:function(){function a(a){return b.apply(this,arguments)}var b=_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function b(a){var c;return _regeneratorRuntime().wrap(function d(b){for(;1;)switch(b.prev=b.next){case 0:return b.prev=0,b.next=3,_dbconn.dbConnection.user.promise().query("SELECT t1.user_id, t2.email FROM userdb.credential AS t1 INNER JOIN userdb.user AS t2 ON t1.user_id = t2.id AND t1.resetPasswordToken = \""+a+"\" and resetPasswordExpires > "+Date.now());case 3:if(c=b.sent,!c[0][0]){b.next=8;break}return b.abrupt("return",c[0][0]);case 8:return b.abrupt("return",null);case 9:b.next=14;break;case 11:b.prev=11,b.t0=b["catch"](0),console.error(b.t0);case 14:return b.abrupt("return",null);case 15:case"end":return b.stop();}},b,null,[[0,11]])}));return a}(),updateUserById:function(){function a(a,c){return b.apply(this,arguments)}var b=_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function c(a,b){var d;return _regeneratorRuntime().wrap(function e(c){for(;1;)switch(c.prev=c.next){case 0:return c.prev=0,c.next=3,_dbconn.dbConnection.user.promise().query("UPDATE user SET ? WHERE id = "+a,b);case 3:return d=c.sent,c.abrupt("return",d);case 7:c.prev=7,c.t0=c["catch"](0),console.error(c.t0);case 10:return c.abrupt("return",null);case 11:case"end":return c.stop();}},c,null,[[0,7]])}));return a}(),updateCredential:function(){function a(a){return b.apply(this,arguments)}var b=_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function b(a){var c;return _regeneratorRuntime().wrap(function d(b){for(;1;)switch(b.prev=b.next){case 0:return b.prev=0,b.next=3,_dbconn.dbConnection.user.promise().query("UPDATE credential SET ? WHERE user_id = "+a.user_id,a);case 3:return c=b.sent,b.abrupt("return",c);case 7:b.prev=7,b.t0=b["catch"](0),console.error(b.t0);case 10:return b.abrupt("return",null);case 11:case"end":return b.stop();}},b,null,[[0,7]])}));return a}(),addUserProjectRole_OBSOLETE:function addUserProjectRole_OBSOLETE(a,b){_dbconn.dbConnection.user.query("INSERT INTO user_project_role SET ?",a,function(a){if(a)throw a;b(a)})},getVerificationTokenByUserId:function(){function a(a){return b.apply(this,arguments)}var b=_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function b(a){var c;return _regeneratorRuntime().wrap(function d(b){for(;1;)switch(b.prev=b.next){case 0:return b.prev=0,b.next=3,_dbconn.dbConnection.user.promise().query("SELECT token FROM verification WHERE user_id = \""+a+"\"");case 3:if(c=b.sent,!c[0][0]){b.next=8;break}return b.abrupt("return",c[0][0].token);case 8:return b.abrupt("return",null);case 9:b.next=14;break;case 11:b.prev=11,b.t0=b["catch"](0),console.error(b.t0);case 14:return b.abrupt("return",null);case 15:case"end":return b.stop();}},b,null,[[0,11]])}));return a}(),getUserIdByVerificationToken:function(){function a(a){return b.apply(this,arguments)}var b=_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function b(a){var c;return _regeneratorRuntime().wrap(function d(b){for(;1;)switch(b.prev=b.next){case 0:return b.prev=0,b.next=3,_dbconn.dbConnection.user.promise().query("SELECT user_id FROM verification WHERE token = \""+a+"\"");case 3:if(c=b.sent,!c[0][0]){b.next=8;break}return b.abrupt("return",c[0][0].user_id);case 8:return b.abrupt("return",null);case 9:b.next=14;break;case 11:b.prev=11,b.t0=b["catch"](0),console.error(b.t0);case 14:return b.abrupt("return",null);case 15:case"end":return b.stop();}},b,null,[[0,11]])}));return a}(),verifyUserAccount:function verifyUserAccount(a,b){_dbconn.dbConnection.user.getConnection(function(c,d){d.beginTransaction(function(b){// START TRANSACTION +if(b)throw b;// update user status +d.query("UPDATE user SET ? WHERE id ="+a.id,a,function(b,c,e){return b?d.rollback(function(){throw b}):void// delete verification token +d.query("DELETE FROM verification WHERE user_id = "+a.id,function(a,b,c){return a?d.rollback(function(){throw a}):void// COMMIT +d.commit(function(a){if(a)return d.rollback(function(){throw a})})})})}),b(c)})},/* ===== GitLab ===== */getGitlabId:function(){function a(a){return b.apply(this,arguments)}var b=_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function b(a){var c;return _regeneratorRuntime().wrap(function d(b){for(;1;)switch(b.prev=b.next){case 0:return b.prev=0,b.next=3,_dbconn.dbConnection.user.promise().query("SELECT gu.gitlab_userId FROM user_gitlab gu, user u WHERE u.id = \""+a+"\" and gu.user_id = u.id");case 3:if(c=b.sent,!c[0][0]){b.next=8;break}return b.abrupt("return",c[0][0].gitlab_userId);case 8:return b.abrupt("return",null);case 9:b.next=15;break;case 11:return b.prev=11,b.t0=b["catch"](0),console.error(b.t0),b.abrupt("return",b.t0);case 15:case"end":return b.stop();}},b,null,[[0,11]])}));return a}(),addGitlabUser:function addGitlabUser(a,b){_dbconn.dbConnection.user.query("INSERT INTO user_gitlab SET ?",a,function(a){if(a)throw a;b(a)})}};exports.dbController=dbController; \ No newline at end of file diff --git a/built/controller/gitlabController.js b/built/controller/gitlabController.js new file mode 100644 index 00000000..053f4ca9 --- /dev/null +++ b/built/controller/gitlabController.js @@ -0,0 +1,2 @@ +"use strict";function _typeof(a){"@babel/helpers - typeof";return _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(a){return typeof a}:function(a){return a&&"function"==typeof Symbol&&a.constructor===Symbol&&a!==Symbol.prototype?"symbol":typeof a},_typeof(a)}Object.defineProperty(exports,"__esModule",{value:!0}),exports.gitlabController=void 0;var _process$env$NODE_ENV,_axios=_interopRequireDefault(require("axios")),_fs=_interopRequireDefault(require("fs")),_formData=_interopRequireDefault(require("form-data"));function _interopRequireDefault(a){return a&&a.__esModule?a:{default:a}}function ownKeys(a,b){var c=Object.keys(a);if(Object.getOwnPropertySymbols){var d=Object.getOwnPropertySymbols(a);b&&(d=d.filter(function(b){return Object.getOwnPropertyDescriptor(a,b).enumerable})),c.push.apply(c,d)}return c}function _objectSpread(a){for(var b,c=1;c<arguments.length;c++)b=null==arguments[c]?{}:arguments[c],c%2?ownKeys(Object(b),!0).forEach(function(c){_defineProperty(a,c,b[c])}):Object.getOwnPropertyDescriptors?Object.defineProperties(a,Object.getOwnPropertyDescriptors(b)):ownKeys(Object(b)).forEach(function(c){Object.defineProperty(a,c,Object.getOwnPropertyDescriptor(b,c))});return a}function _defineProperty(a,b,c){return b in a?Object.defineProperty(a,b,{value:c,enumerable:!0,configurable:!0,writable:!0}):a[b]=c,a}function _regeneratorRuntime(){"use strict";/*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */function a(a,b,c){return Object.defineProperty(a,b,{value:c,enumerable:!0,configurable:!0,writable:!0}),a[b]}function b(a,b,e,f){var g=b&&b.prototype instanceof d?b:d,h=Object.create(g.prototype),j=new l(f||[]);return h._invoke=function(a,b,d){var e="suspendedStart";return function(f,g){if("executing"===e)throw new Error("Generator is already running");if("completed"===e){if("throw"===f)throw g;return n()}for(d.method=f,d.arg=g;;){var h=d.delegate;if(h){var j=i(h,d);if(j){if(j===v)continue;return j}}if("next"===d.method)d.sent=d._sent=d.arg;else if("throw"===d.method){if("suspendedStart"===e)throw e="completed",d.arg;d.dispatchException(d.arg)}else"return"===d.method&&d.abrupt("return",d.arg);e="executing";var k=c(a,b,d);if("normal"===k.type){if(e=d.done?"completed":"suspendedYield",k.arg===v)continue;return{value:k.arg,done:d.done}}"throw"===k.type&&(e="completed",d.method="throw",d.arg=k.arg)}}}(a,e,j),h}function c(a,b,c){try{return{type:"normal",arg:a.call(b,c)}}catch(a){return{type:"throw",arg:a}}}function d(){}function e(){}function f(){}function g(b){["next","throw","return"].forEach(function(c){a(b,c,function(a){return this._invoke(c,a)})})}function h(a,b){function d(e,f,g,h){var i=c(a[e],a,f);if("throw"!==i.type){var j=i.arg,k=j.value;return k&&"object"==_typeof(k)&&q.call(k,"__await")?b.resolve(k.__await).then(function(a){d("next",a,g,h)},function(a){d("throw",a,g,h)}):b.resolve(k).then(function(a){j.value=a,g(j)},function(a){return d("throw",a,g,h)})}h(i.arg)}var e;this._invoke=function(a,c){function f(){return new b(function(b,e){d(a,c,b,e)})}return e=e?e.then(f,f):f()}}function i(a,b){var d=a.iterator[b.method];if(void 0===d){if(b.delegate=null,"throw"===b.method){if(a.iterator["return"]&&(b.method="return",b.arg=void 0,i(a,b),"throw"===b.method))return v;b.method="throw",b.arg=new TypeError("The iterator does not provide a 'throw' method")}return v}var e=c(d,a.iterator,b.arg);if("throw"===e.type)return b.method="throw",b.arg=e.arg,b.delegate=null,v;var f=e.arg;return f?f.done?(b[a.resultName]=f.value,b.next=a.nextLoc,"return"!==b.method&&(b.method="next",b.arg=void 0),b.delegate=null,v):f:(b.method="throw",b.arg=new TypeError("iterator result is not an object"),b.delegate=null,v)}function j(a){var b={tryLoc:a[0]};1 in a&&(b.catchLoc=a[1]),2 in a&&(b.finallyLoc=a[2],b.afterLoc=a[3]),this.tryEntries.push(b)}function k(a){var b=a.completion||{};b.type="normal",delete b.arg,a.completion=b}function l(a){this.tryEntries=[{tryLoc:"root"}],a.forEach(j,this),this.reset(!0)}function m(a){if(a){var b=a[s];if(b)return b.call(a);if("function"==typeof a.next)return a;if(!isNaN(a.length)){var c=-1,d=function b(){for(;++c<a.length;)if(q.call(a,c))return b.value=a[c],b.done=!1,b;return b.value=void 0,b.done=!0,b};return d.next=d}}return{next:n}}function n(){return{value:void 0,done:!0}}_regeneratorRuntime=function(){return o};var o={},p=Object.prototype,q=p.hasOwnProperty,r="function"==typeof Symbol?Symbol:{},s=r.iterator||"@@iterator",t=r.asyncIterator||"@@asyncIterator",u=r.toStringTag||"@@toStringTag";try{a({},"")}catch(b){a=function(a,b,c){return a[b]=c}}o.wrap=b;var v={},w={};a(w,s,function(){return this});var x=Object.getPrototypeOf,y=x&&x(x(m([])));y&&y!==p&&q.call(y,s)&&(w=y);var z=f.prototype=d.prototype=Object.create(w);return e.prototype=f,a(z,"constructor",f),a(f,"constructor",e),e.displayName=a(f,u,"GeneratorFunction"),o.isGeneratorFunction=function(a){var b="function"==typeof a&&a.constructor;return!!b&&(b===e||"GeneratorFunction"===(b.displayName||b.name))},o.mark=function(b){return Object.setPrototypeOf?Object.setPrototypeOf(b,f):(b.__proto__=f,a(b,u,"GeneratorFunction")),b.prototype=Object.create(z),b},o.awrap=function(a){return{__await:a}},g(h.prototype),a(h.prototype,t,function(){return this}),o.AsyncIterator=h,o.async=function(a,c,d,e,f){void 0===f&&(f=Promise);var g=new h(b(a,c,d,e),f);return o.isGeneratorFunction(c)?g:g.next().then(function(a){return a.done?a.value:g.next()})},g(z),a(z,u,"Generator"),a(z,s,function(){return this}),a(z,"toString",function(){return"[object Generator]"}),o.keys=function(a){var b=[];for(var c in a)b.push(c);return b.reverse(),function c(){for(;b.length;){var d=b.pop();if(d in a)return c.value=d,c.done=!1,c}return c.done=!0,c}},o.values=m,l.prototype={constructor:l,reset:function reset(a){if(this.prev=0,this.next=0,this.sent=this._sent=void 0,this.done=!1,this.delegate=null,this.method="next",this.arg=void 0,this.tryEntries.forEach(k),!a)for(var b in this)"t"===b.charAt(0)&&q.call(this,b)&&!isNaN(+b.slice(1))&&(this[b]=void 0)},stop:function stop(){this.done=!0;var a=this.tryEntries[0].completion;if("throw"===a.type)throw a.arg;return this.rval},dispatchException:function dispatchException(a){function b(b,d){return f.type="throw",f.arg=a,c.next=b,d&&(c.method="next",c.arg=void 0),!!d}if(this.done)throw a;for(var c=this,d=this.tryEntries.length-1;0<=d;--d){var e=this.tryEntries[d],f=e.completion;if("root"===e.tryLoc)return b("end");if(e.tryLoc<=this.prev){var g=q.call(e,"catchLoc"),h=q.call(e,"finallyLoc");if(g&&h){if(this.prev<e.catchLoc)return b(e.catchLoc,!0);if(this.prev<e.finallyLoc)return b(e.finallyLoc)}else if(!g){if(!h)throw new Error("try statement without catch or finally");if(this.prev<e.finallyLoc)return b(e.finallyLoc)}else if(this.prev<e.catchLoc)return b(e.catchLoc,!0)}}},abrupt:function abrupt(a,b){for(var c,d=this.tryEntries.length-1;0<=d;--d)if(c=this.tryEntries[d],c.tryLoc<=this.prev&&q.call(c,"finallyLoc")&&this.prev<c.finallyLoc){var e=c;break}e&&("break"===a||"continue"===a)&&e.tryLoc<=b&&b<=e.finallyLoc&&(e=null);var f=e?e.completion:{};return f.type=a,f.arg=b,e?(this.method="next",this.next=e.finallyLoc,v):this.complete(f)},complete:function complete(a,b){if("throw"===a.type)throw a.arg;return"break"===a.type||"continue"===a.type?this.next=a.arg:"return"===a.type?(this.rval=this.arg=a.arg,this.method="return",this.next="end"):"normal"===a.type&&b&&(this.next=b),v},finish:function finish(a){for(var b,c=this.tryEntries.length-1;0<=c;--c)if(b=this.tryEntries[c],b.finallyLoc===a)return this.complete(b.completion,b.afterLoc),k(b),v},catch:function _catch(a){for(var b,c=this.tryEntries.length-1;0<=c;--c)if(b=this.tryEntries[c],b.tryLoc===a){var d=b.completion;if("throw"===d.type){var e=d.arg;k(b)}return e}throw new Error("illegal catch attempt")},delegateYield:function delegateYield(a,b,c){return this.delegate={iterator:m(a),resultName:b,nextLoc:c},"next"===this.method&&(this.arg=void 0),v}},o}function asyncGeneratorStep(a,b,c,d,e,f,g){try{var h=a[f](g),i=h.value}catch(a){return void c(a)}h.done?b(i):Promise.resolve(i).then(d,e)}function _asyncToGenerator(a){return function(){var b=this,c=arguments;return new Promise(function(d,e){function f(a){asyncGeneratorStep(h,d,e,f,g,"next",a)}function g(a){asyncGeneratorStep(h,d,e,f,g,"throw",a)}var h=a.apply(b,c);f(void 0)})}}var env=null!==(_process$env$NODE_ENV=process.env.NODE_ENV)&&void 0!==_process$env$NODE_ENV?_process$env$NODE_ENV:"testing",config=require("../config/config")[env],gitlabController={getUserByEmail:function(){function a(){return b.apply(this,arguments)}var b=_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function b(a){return _regeneratorRuntime().wrap(function c(b){for(;1;)switch(b.prev=b.next){case 0:return b.next=2,(0,_axios["default"])({method:"get",url:"https://transfer.hft-stuttgart.de/gitlab/api/v4/users?search="+a,headers:{Authorization:"Bearer "+config.gitlab.token_readWriteProjects}}).then(function(a){return a.data[0]})["catch"](function(a){return console.error(a),null});case 2:return b.abrupt("return",b.sent);case 3:case"end":return b.stop();}},b)}));return a}(),createNewPages:function(){function a(a,c,d){return b.apply(this,arguments)}var b=_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function d(a,b,c){var e;return _regeneratorRuntime().wrap(function f(d){for(;1;)switch(d.prev=d.next){case 0:return e=new _formData["default"],e.append("avatar",_fs["default"].createReadStream(b)),d.next=4,(0,_axios["default"])({method:"post",url:"https://transfer.hft-stuttgart.de/gitlab/api/v4/projects/user/"+(a.getOwnerGitlabId()+"?name=")+(a.getName()+"&description=")+(a.getDesc()+"&tag_list=website&use_custom_template=true&template_name=")+c,headers:_objectSpread({Authorization:"Bearer "+config.gitlab.token_readWriteProjects},e.getHeaders()),data:e}).then(function(a){return a.data})["catch"](function(a){return console.error("ERR Status: "+a.response.status),console.error("ERR Name: "+a.response.data.message.name),console.error("ERR Path: "+a.response.data.message.path),a.response});case 4:return d.abrupt("return",d.sent);case 5:case"end":return d.stop();}},d)}));return a}(),updateProject:function(){function a(a,c){return b.apply(this,arguments)}var b=_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function c(a,b){var d;return _regeneratorRuntime().wrap(function e(c){for(;1;)switch(c.prev=c.next){case 0:return d=new _formData["default"],b&&d.append("avatar",_fs["default"].createReadStream(b)),c.next=4,(0,_axios["default"])({method:"put",url:"https://transfer.hft-stuttgart.de/gitlab/api/v4/projects/"+a.getId()+"?name="+a.getName()+"&description="+a.getDesc(),headers:_objectSpread({Authorization:"Bearer "+config.gitlab.token_readWriteProjects},d.getHeaders()),data:d})// .then(res => res.data[0]) +.then(function(a){return a.data})["catch"](function(a){return console.error("ERR Status: "+a.response.status),console.error("ERR Name: "+a.response.data.message.name),console.error("ERR Path: "+a.response.data.message.path),a.response});case 4:return c.abrupt("return",c.sent);case 5:case"end":return c.stop();}},c)}));return a}(),deleteProjectById:function(){function a(a){return b.apply(this,arguments)}var b=_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function b(a){return _regeneratorRuntime().wrap(function c(b){for(;1;)switch(b.prev=b.next){case 0:return b.next=2,(0,_axios["default"])({method:"delete",url:"https://transfer.hft-stuttgart.de/gitlab/api/v4/projects/"+a,headers:{Authorization:"Bearer "+config.gitlab.token_readWriteProjects}}).then(function(a){return!0})["catch"](function(a){return console.error("ERR Status: "+a.response.status),console.error("ERR Name: "+a.response.data.message.name),console.error("ERR Path: "+a.response.data.message.path),!1});case 2:return b.abrupt("return",b.sent);case 3:case"end":return b.stop();}},b)}));return a}(),getUserProjects:function(){function a(a){return b.apply(this,arguments)}var b=_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function b(a){return _regeneratorRuntime().wrap(function c(b){for(;1;)switch(b.prev=b.next){case 0:return b.next=2,(0,_axios["default"])({method:"get",url:"https://transfer.hft-stuttgart.de/gitlab/api/v4/users/"+a+"/projects?owned=true&visibility=public",headers:{Authorization:"Bearer "+config.gitlab.token_readWriteProjects}}).then(function(a){return a.data})["catch"](function(a){return console.error(a),null});case 2:return b.abrupt("return",b.sent);case 3:case"end":return b.stop();}},b)}));return a}(),getProjectById:function(){function a(a){return b.apply(this,arguments)}var b=_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function b(a){return _regeneratorRuntime().wrap(function c(b){for(;1;)switch(b.prev=b.next){case 0:return b.next=2,(0,_axios["default"])({method:"get",url:"https://transfer.hft-stuttgart.de/gitlab/api/v4/projects/"+a,headers:{Authorization:"Bearer "+config.gitlab.token_readWriteProjects}}).then(function(a){return a.data})["catch"](function(a){return console.error(a),null});case 2:return b.abrupt("return",b.sent);case 3:case"end":return b.stop();}},b)}));return a}(),getProjectPipelineLatestStatus:function(){function a(a){return b.apply(this,arguments)}var b=_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function b(a){return _regeneratorRuntime().wrap(function c(b){for(;1;)switch(b.prev=b.next){case 0:return b.next=2,(0,_axios["default"])({method:"get",url:"https://transfer.hft-stuttgart.de/gitlab/api/v4/projects/"+a+"/pipelines"}).then(function(a){return a.data[0].status})["catch"](function(a){return console.error(a),null});case 2:return b.abrupt("return",b.sent);case 3:case"end":return b.stop();}},b)}));return a}()};exports.gitlabController=gitlabController; \ No newline at end of file diff --git a/built/controller/publicController.js b/built/controller/publicController.js new file mode 100644 index 00000000..c425b148 --- /dev/null +++ b/built/controller/publicController.js @@ -0,0 +1,9 @@ +"use strict";function _typeof(a){"@babel/helpers - typeof";return _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(a){return typeof a}:function(a){return a&&"function"==typeof Symbol&&a.constructor===Symbol&&a!==Symbol.prototype?"symbol":typeof a},_typeof(a)}Object.defineProperty(exports,"__esModule",{value:!0}),exports.publicController=void 0;var _async=_interopRequireDefault(require("async")),_bcryptjs=_interopRequireDefault(require("bcryptjs")),_mailer=require("../config/mailer"),_const=require("../config/const"),_dbController=require("./dbController");function _interopRequireDefault(a){return a&&a.__esModule?a:{default:a}}function _regeneratorRuntime(){"use strict";/*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */function a(a,b,c){return Object.defineProperty(a,b,{value:c,enumerable:!0,configurable:!0,writable:!0}),a[b]}function b(a,b,e,f){var g=b&&b.prototype instanceof d?b:d,h=Object.create(g.prototype),j=new l(f||[]);return h._invoke=function(a,b,d){var e="suspendedStart";return function(f,g){if("executing"===e)throw new Error("Generator is already running");if("completed"===e){if("throw"===f)throw g;return n()}for(d.method=f,d.arg=g;;){var h=d.delegate;if(h){var j=i(h,d);if(j){if(j===v)continue;return j}}if("next"===d.method)d.sent=d._sent=d.arg;else if("throw"===d.method){if("suspendedStart"===e)throw e="completed",d.arg;d.dispatchException(d.arg)}else"return"===d.method&&d.abrupt("return",d.arg);e="executing";var k=c(a,b,d);if("normal"===k.type){if(e=d.done?"completed":"suspendedYield",k.arg===v)continue;return{value:k.arg,done:d.done}}"throw"===k.type&&(e="completed",d.method="throw",d.arg=k.arg)}}}(a,e,j),h}function c(a,b,c){try{return{type:"normal",arg:a.call(b,c)}}catch(a){return{type:"throw",arg:a}}}function d(){}function e(){}function f(){}function g(b){["next","throw","return"].forEach(function(c){a(b,c,function(a){return this._invoke(c,a)})})}function h(a,b){function d(e,f,g,h){var i=c(a[e],a,f);if("throw"!==i.type){var j=i.arg,k=j.value;return k&&"object"==_typeof(k)&&q.call(k,"__await")?b.resolve(k.__await).then(function(a){d("next",a,g,h)},function(a){d("throw",a,g,h)}):b.resolve(k).then(function(a){j.value=a,g(j)},function(a){return d("throw",a,g,h)})}h(i.arg)}var e;this._invoke=function(a,c){function f(){return new b(function(b,e){d(a,c,b,e)})}return e=e?e.then(f,f):f()}}function i(a,b){var d=a.iterator[b.method];if(void 0===d){if(b.delegate=null,"throw"===b.method){if(a.iterator["return"]&&(b.method="return",b.arg=void 0,i(a,b),"throw"===b.method))return v;b.method="throw",b.arg=new TypeError("The iterator does not provide a 'throw' method")}return v}var e=c(d,a.iterator,b.arg);if("throw"===e.type)return b.method="throw",b.arg=e.arg,b.delegate=null,v;var f=e.arg;return f?f.done?(b[a.resultName]=f.value,b.next=a.nextLoc,"return"!==b.method&&(b.method="next",b.arg=void 0),b.delegate=null,v):f:(b.method="throw",b.arg=new TypeError("iterator result is not an object"),b.delegate=null,v)}function j(a){var b={tryLoc:a[0]};1 in a&&(b.catchLoc=a[1]),2 in a&&(b.finallyLoc=a[2],b.afterLoc=a[3]),this.tryEntries.push(b)}function k(a){var b=a.completion||{};b.type="normal",delete b.arg,a.completion=b}function l(a){this.tryEntries=[{tryLoc:"root"}],a.forEach(j,this),this.reset(!0)}function m(a){if(a){var b=a[s];if(b)return b.call(a);if("function"==typeof a.next)return a;if(!isNaN(a.length)){var c=-1,d=function b(){for(;++c<a.length;)if(q.call(a,c))return b.value=a[c],b.done=!1,b;return b.value=void 0,b.done=!0,b};return d.next=d}}return{next:n}}function n(){return{value:void 0,done:!0}}_regeneratorRuntime=function(){return o};var o={},p=Object.prototype,q=p.hasOwnProperty,r="function"==typeof Symbol?Symbol:{},s=r.iterator||"@@iterator",t=r.asyncIterator||"@@asyncIterator",u=r.toStringTag||"@@toStringTag";try{a({},"")}catch(b){a=function(a,b,c){return a[b]=c}}o.wrap=b;var v={},w={};a(w,s,function(){return this});var x=Object.getPrototypeOf,y=x&&x(x(m([])));y&&y!==p&&q.call(y,s)&&(w=y);var z=f.prototype=d.prototype=Object.create(w);return e.prototype=f,a(z,"constructor",f),a(f,"constructor",e),e.displayName=a(f,u,"GeneratorFunction"),o.isGeneratorFunction=function(a){var b="function"==typeof a&&a.constructor;return!!b&&(b===e||"GeneratorFunction"===(b.displayName||b.name))},o.mark=function(b){return Object.setPrototypeOf?Object.setPrototypeOf(b,f):(b.__proto__=f,a(b,u,"GeneratorFunction")),b.prototype=Object.create(z),b},o.awrap=function(a){return{__await:a}},g(h.prototype),a(h.prototype,t,function(){return this}),o.AsyncIterator=h,o.async=function(a,c,d,e,f){void 0===f&&(f=Promise);var g=new h(b(a,c,d,e),f);return o.isGeneratorFunction(c)?g:g.next().then(function(a){return a.done?a.value:g.next()})},g(z),a(z,u,"Generator"),a(z,s,function(){return this}),a(z,"toString",function(){return"[object Generator]"}),o.keys=function(a){var b=[];for(var c in a)b.push(c);return b.reverse(),function c(){for(;b.length;){var d=b.pop();if(d in a)return c.value=d,c.done=!1,c}return c.done=!0,c}},o.values=m,l.prototype={constructor:l,reset:function reset(a){if(this.prev=0,this.next=0,this.sent=this._sent=void 0,this.done=!1,this.delegate=null,this.method="next",this.arg=void 0,this.tryEntries.forEach(k),!a)for(var b in this)"t"===b.charAt(0)&&q.call(this,b)&&!isNaN(+b.slice(1))&&(this[b]=void 0)},stop:function stop(){this.done=!0;var a=this.tryEntries[0].completion;if("throw"===a.type)throw a.arg;return this.rval},dispatchException:function dispatchException(a){function b(b,d){return f.type="throw",f.arg=a,c.next=b,d&&(c.method="next",c.arg=void 0),!!d}if(this.done)throw a;for(var c=this,d=this.tryEntries.length-1;0<=d;--d){var e=this.tryEntries[d],f=e.completion;if("root"===e.tryLoc)return b("end");if(e.tryLoc<=this.prev){var g=q.call(e,"catchLoc"),h=q.call(e,"finallyLoc");if(g&&h){if(this.prev<e.catchLoc)return b(e.catchLoc,!0);if(this.prev<e.finallyLoc)return b(e.finallyLoc)}else if(!g){if(!h)throw new Error("try statement without catch or finally");if(this.prev<e.finallyLoc)return b(e.finallyLoc)}else if(this.prev<e.catchLoc)return b(e.catchLoc,!0)}}},abrupt:function abrupt(a,b){for(var c,d=this.tryEntries.length-1;0<=d;--d)if(c=this.tryEntries[d],c.tryLoc<=this.prev&&q.call(c,"finallyLoc")&&this.prev<c.finallyLoc){var e=c;break}e&&("break"===a||"continue"===a)&&e.tryLoc<=b&&b<=e.finallyLoc&&(e=null);var f=e?e.completion:{};return f.type=a,f.arg=b,e?(this.method="next",this.next=e.finallyLoc,v):this.complete(f)},complete:function complete(a,b){if("throw"===a.type)throw a.arg;return"break"===a.type||"continue"===a.type?this.next=a.arg:"return"===a.type?(this.rval=this.arg=a.arg,this.method="return",this.next="end"):"normal"===a.type&&b&&(this.next=b),v},finish:function finish(a){for(var b,c=this.tryEntries.length-1;0<=c;--c)if(b=this.tryEntries[c],b.finallyLoc===a)return this.complete(b.completion,b.afterLoc),k(b),v},catch:function _catch(a){for(var b,c=this.tryEntries.length-1;0<=c;--c)if(b=this.tryEntries[c],b.tryLoc===a){var d=b.completion;if("throw"===d.type){var e=d.arg;k(b)}return e}throw new Error("illegal catch attempt")},delegateYield:function delegateYield(a,b,c){return this.delegate={iterator:m(a),resultName:b,nextLoc:c},"next"===this.method&&(this.arg=void 0),v}},o}function asyncGeneratorStep(a,b,c,d,e,f,g){try{var h=a[f](g),i=h.value}catch(a){return void c(a)}h.done?b(i):Promise.resolve(i).then(d,e)}function _asyncToGenerator(a){return function(){var b=this,c=arguments;return new Promise(function(d,e){function f(a){asyncGeneratorStep(h,d,e,f,g,"next",a)}function g(a){asyncGeneratorStep(h,d,e,f,g,"throw",a)}var h=a.apply(b,c);f(void 0)})}}var saltRounds=10,publicController={showRegistrationPage:function showRegistrationPage(a,b){a.render(b+"/account/registration")},showContactPage:function showContactPage(a,b,c){b.render(c+"/account/contact",{user:a.user})},showForgotPwdPage:function showForgotPwdPage(a,b,c){b.render(c+"/account/forgotPwd",{user:a.user})},showResetPassword:function(){function a(){return b.apply(this,arguments)}var b=_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function d(a,b,c){var e;return _regeneratorRuntime().wrap(function f(d){for(;1;)switch(d.prev=d.next){case 0:return d.next=2,_dbController.dbController.getUserByToken(a.params.token);case 2:e=d.sent,e?b.render(c+"/account/reset"):(b.flash("error","Der Schl\xFCssel zum zur\xFCcksetzen des Passworts ist ung\xFCltig oder abgelaufen."),b.redirect("/account/forgotPwd"));case 4:case"end":return d.stop();}},d)}));return a}(),sendContactMessage:function sendContactMessage(a,b){var c=a.body.inputEmail,d="support-transfer@hft-stuttgart.de",e=a.body.name,f=a.body.message,g="Ihre Anfrage an das Transferportal",h="<div>Es wurde eine Anfrage an das Transferportal gestellt: <br/><br/>NAME: "+e+"<br/>NACHRICHT: "+f+"</div>";_async["default"].waterfall([function(a){// send email +_mailer.mailer.options.to=d,_mailer.mailer.options.cc=c,_mailer.mailer.options.subject=g,_mailer.mailer.options.html=h,_mailer.mailer.transporter.sendMail(_mailer.mailer.options,function(b){a(b,"done")})}],function(a){a?(console.error(a),b.flash("error","Ein Fehler ist aufgetreten. Bitte versuchen Sie es erneut.")):b.flash("success","Vielen Dank f\xFCr Ihre Anfrage. Wir melden uns baldm\xF6glichst bei Ihnen. Eine Kopie Ihrer Anfrage wurde an "+c+" versandt."),b.redirect("/account/contact")})},registerUser:function registerUser(a,b,c){// user data +var d=new Date,e={salutation:a.body.inputSalutation,title:a.body.inputTitle,firstname:a.body.inputFirstname,lastname:a.body.inputLastname,email:a.body.inputEmail,organisation:a.body.inputOrganisation,industry:a.body.inputIndustry,speciality:a.body.inputSpeciality,createdDate:d.toISOString().slice(0,10)},f=e.email,g=f.indexOf("@"),h=f.length,i=f.slice(g,h);"@hft-stuttgart.de"===i.toLowerCase()?(b.flash("error","Fehlgeschlagen: HFT-Account"),b.redirect("/account/registration")):_async["default"].waterfall([function(b){// generate token +for(var c="",d="abcdefghijklmnopqrstuvwxyz0123456789",f=0;40>f;f++)c+=d.charAt(Math.floor(Math.random()*d.length));// encrypt password +_bcryptjs["default"].genSalt(saltRounds,function(d,f){_bcryptjs["default"].hash(a.body.inputPassword,f,function(a,d){var f={profile:e,password:d,verificationToken:c};b(a,f)})})},// save data +function(d,e){_dbController.dbController.registerNewUser(d,function(e){if(e)b.flash("error","Fehlgeschlagen");else{// send email +var f="Bitte best\xE4tigen Sie Ihr M4_LAB Benutzerkonto",g="<div>Lieber Nutzer,<br/><br/><p>vielen Dank f\xFCr Ihre Anmeldung am Transferportal der HFT Stuttgart. <br/>Um Ihre Anmeldung zu best\xE4tigen, klicken Sie bitte <a href="+(c.app.host+"")+"/verifyAccount?token="+(d.verificationToken+"")+">diesen Link</a> <br/><br/>Ohne Best\xE4tigung Ihres Kontos m\xFCssen wir Ihr Konto leider nach 7 Tagen l\xF6schen.</p><br/>"+(_const.miscConst.mailSignature+"")+"</div>";// user feedback +_mailer.mailer.options.to=a.body.inputEmail,_mailer.mailer.options.subject="Bitte best\xE4tigen Sie Ihr M4_LAB Benutzerkonto",_mailer.mailer.options.html=g,_mailer.mailer.transporter.sendMail(_mailer.mailer.options,function(a){if(a)throw console.error("Cannot send email. [Error] "+(a+"")),a}),b.flash("success","Vielen Dank f\xFCr Ihre Registrierung!\r\n\r\nWir haben Ihnen eine E-Mail an Ihre verwendete Adresse gesendet. Diese enth\xE4lt einen Link zur Best\xE4tigung Ihres Accounts.\r\nWenn Sie die Mail nicht in ihrem Postfach vorfinden, pr\xFCfen Sie bitte auch Ihren Spam-Ordner.")}b.redirect("/account/registration")})}])},verifyAccount:function(){function a(a,c,d){return b.apply(this,arguments)}var b=_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function d(a,b,c){var e,f;return _regeneratorRuntime().wrap(function g(d){for(;1;)switch(d.prev=d.next){case 0:return d.next=2,_dbController.dbController.getUserIdByVerificationToken(a.query.token);case 2:e=d.sent,e?(f={id:e,verificationStatus:1},_dbController.dbController.verifyUserAccount(f,/*#__PURE__*/function(){var a=_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function d(a){var f,g,h;return _regeneratorRuntime().wrap(function i(d){for(;1;)switch(d.prev=d.next){case 0:if(!a){d.next=5;break}console.error(a),b.render(c+"/account/verification",{status:!1}),d.next=9;break;case 5:return d.next=7,_dbController.dbController.getUserEmailById(e);case 7:f=d.sent,f?(g="Herzlich willkommen",h="<div>Lieber Nutzer,<br/><br/><p>herzlich willkommen beim Transferportal der HFT Stuttgart!<br/>Sie k\xF6nnen nun alle Dienste des Portals nutzen.<p/><br/>"+_const.miscConst.mailSignature,_mailer.mailer.options.to=f,_mailer.mailer.options.subject=g,_mailer.mailer.options.html=h,_mailer.mailer.transporter.sendMail(_mailer.mailer.options,function(a){if(a)throw console.log("cannot send email"),a}),b.render(c+"/account/verification",{status:!0})):b.render(c+"/account/verification",{status:!1});case 9:case"end":return d.stop();}},d)}));return function(b){return a.apply(this,arguments)}}())):b.render(c+"/account/verification",{status:null});case 4:case"end":return d.stop();}},d)}));return a}(),resetPassword:function(){function a(a,c){return b.apply(this,arguments)}var b=_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function c(a,b){var d,e;return _regeneratorRuntime().wrap(function f(c){for(;1;)switch(c.prev=c.next){case 0:return d=a.body.inputNewPwd,c.next=3,_dbController.dbController.getUserByToken(a.params.token);case 3:e=c.sent,e?_bcryptjs["default"].genSalt(saltRounds,function(a,c){_bcryptjs["default"].hash(d,c,/*#__PURE__*/function(){var a=_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function d(a,c){var f,g;return _regeneratorRuntime().wrap(function d(a){for(;1;)switch(a.prev=a.next){case 0:return f={password:c,user_id:e.user_id,resetPasswordToken:null,resetPasswordExpires:null},a.next=3,_dbController.dbController.updateCredential(f);case 3:g=a.sent,g?(b.flash("success","Passwort aktualisiert!"),_mailer.mailer.options.to=e.email,_mailer.mailer.options.subject=_const.miscConst.updatePasswordMailSubject,_mailer.mailer.options.html=_const.miscConst.updatePasswordMailContent+"<div>"+_const.miscConst.mailSignature+"</div>",_mailer.mailer.transporter.sendMail(_mailer.mailer.options,function(a){a&&console.log(a)})):(console.log("Failed to reset password"),b.flash("error","Datenbankfehler: Passwort kann nicht ge\xE4ndert werden.")),b.redirect("/login");case 6:case"end":return a.stop();}},d)}));return function(b,c){return a.apply(this,arguments)}}())}):(b.flash("error","User not found."),b.redirect("/login"));case 5:case"end":return c.stop();}},c)}));return a}(),generateNewToken:function generateNewToken(a,b,c){var d=Math.floor,e=a.body.inputEmail;_async["default"].waterfall([/*#__PURE__*/function(){var a=_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function b(a){var f,g,h,j,k,l,m,n;return _regeneratorRuntime().wrap(function i(b){for(;1;)switch(b.prev=b.next){case 0:return b.next=2,_dbController.dbController.checkUserEmail(e);case 2:if(f=b.sent,f){b.next=7;break}console.log("No user found: "+(e+"")),b.next=17;break;case 7:for(g="",h="abcdefghijklmnopqrstuvwxyz0123456789",j=0;40>j;j++)g+=h.charAt(d(Math.random()*h.length));return k="Ihre Passwort-Anfrage an das Transferportal der HFT Stuttgart",l="<div>Lieber Nutzer,<br/><br/><p>wir haben Ihre Anfrage zur Erneuerung Ihres Passwortes erhalten. Falls Sie diese Anfrage nicht gesendet haben, ignorieren Sie bitte diese E-Mail.<br/><br/>Sie k\xF6nnen Ihr Passwort mit dem Klick auf diesen Link \xE4ndern: "+(c.app.host+"/reset/")+(g+"<br/>Dieser Link ist aus Sicherheitsgr\xFCnden nur f\xFCr 1 Stunde g\xFCltig.<br/></p>")+(_const.miscConst.mailSignature+"</div>"),m={user_id:f.id,resetPasswordToken:g,resetPasswordExpires:Date.now()+36e5// 1 hour +},b.next=15,_dbController.dbController.updateCredential(m);case 15:n=b.sent,n?(_mailer.mailer.options.to=e,_mailer.mailer.options.subject=k,_mailer.mailer.options.html=l,_mailer.mailer.transporter.sendMail(_mailer.mailer.options,function(a){a&&console.error(a)})):console.log("failed to update credential");case 17:a(null);case 18:case"end":return b.stop();}},b)}));return function(b){return a.apply(this,arguments)}}()],function(a){a?b.flash("error","Ein Fehler ist aufgetreten. Bitte versuchen Sie es erneut."):b.flash("success","Wenn Ihre E-Mail-Adresse registriert ist, wurde eine E-Mail mit dem weiteren Vorgehen an "+(e+"")+" versendet."),b.redirect("/account/forgotPwd")})},checkUserEmail:function(){function a(a,c){return b.apply(this,arguments)}var b=_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function c(a,b){var d;return _regeneratorRuntime().wrap(function e(c){for(;1;)switch(c.prev=c.next){case 0:return c.next=2,_dbController.dbController.checkUserEmail(a.params.email);case 2:d=c.sent,d?b.send(!1):b.send(!0);case 4:case"end":return c.stop();}},c)}));return a}()};exports.publicController=publicController; \ No newline at end of file diff --git a/built/public/default/logo.png b/built/public/default/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..49d1a2c4816f76a799d3063b4c3f8fb37962f709 GIT binary patch literal 86689 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�oCecy6aZ}Ii1`{@3p zcaQaLx4i{FU7r@7cODft^~kJi@d{#sCS`x{575fpIK3(4I^K_<IVp@hLoK`nQuMbq zhFdcCmS>2_8e{d<4dSpMmiD6=wP`*$WUvE^(O;ifVML$m5q?x=)D(5dwY3cv$V_Mk z08FZejQcnQxU-4QvjS|&kLu1Q1O?b;#(o5#!+(o`-S96l@VSA}zzecR|5N-^5&Lia oOZ?Ay{wMxF^ZZ-}t(pGgl*K`L!x^t784ln=n_j<Kg>;YoFWfjc)Bpeg literal 0 HcmV?d00001 diff --git a/built/public/js/generalFunction.js b/built/public/js/generalFunction.js new file mode 100644 index 00000000..285537dc --- /dev/null +++ b/built/public/js/generalFunction.js @@ -0,0 +1,9 @@ +// password requirement +function checkPasswordReq (pwd) { + if (pwd.length < 8) { + isBest = false + } else { + isBest = true + } + return isBest +} diff --git a/built/public/js/headfoot.js b/built/public/js/headfoot.js new file mode 100644 index 00000000..ea46aa2f --- /dev/null +++ b/built/public/js/headfoot.js @@ -0,0 +1,224 @@ +const menu = [{ name: 'Informationen', combos: [{ name: 'Projekte', link: '/project' }, { name: 'Ãœber das M4_LAB', link: '/projectoverview?projectID=1' }, { name: 'Kontakt', link: '/account/contact' }], type: 'dropdown', link: '#' }, { name: 'Zusammenarbeit', combos: [{ name: 'Mailinglisten', link: '/mailinglists' }, { name: 'Videokonferenzen', link: '/videoconference.html' }/* {'name':'...', 'link':'#'} */], type: 'dropdown', link: '#' }, { name: 'Events', combos: [{ name: 'Veranstaltungen der HfT', link: 'http://www.hft-stuttgart.de/Aktuell/Veranstaltungen/' }, { name: 'Veranstaltungen der HfT Forschung', link: 'https://www.hft-stuttgart.de/forschung/veranstaltungen' }], type: 'dropdown', link: '#' }, { name: 'Benutzerkonto', combos: [], type: '', link: '/account/' }] + +const hft_links = [{ url: '/account/contact', name: 'Kontakt' }, { url: 'https://www.hft-stuttgart.de/impressum', name: 'Impressum' }, { url: 'https://www.hft-stuttgart.de/datenschutz', name: 'Datenschutz' }] + +const socialmedias = [{ url: 'https://twitter.com/InnolabM4', name: 'fa-twitter' }, { url: 'https://www.facebook.com/HfTStuttgart/', name: 'fa-facebook-square' }, { url: 'https://www.instagram.com/m4_lab/', name: 'fa-instagram' }, { url: 'https://de.linkedin.com/school/hochschule-f%C3%BCr-technik-stuttgart-%E2%80%93-university-of-applied-sciences/', name: 'fa-linkedin' }, { url: 'https://www.youtube.com/channel/UCi0_JfF2qMZbOhOnNH5PyHA', name: 'fa-youtube' }] + +const footer_images = [{ src: '/images/demo/Innovative_Hochschule_Initiative_BMBF_GWK_RGB.jpg', alt: 'Innovative Hochschule' }] + +function prependChild (parent, child) { + parent.insertBefore(child, parent.childNodes[0]) +} + +function readCookie (cname) { + const name = cname + '=' + const decodedCookie = decodeURIComponent(document.cookie) + const ca = decodedCookie.split(';') + for (let i = 0; i < ca.length; i++) { + let c = ca[i] + while (c.charAt(0) == ' ') { + c = c.substring(1) + } + if (c.indexOf(name) == 0) { + return c.substring(name.length, c.length) + } + } + return '' +} + +function sendRequest (URL) { + console.log(document.cookie) + const xhr = new XMLHttpRequest() + xhr.open('POST', URL, true) + const token = readCookie('XSRF-TOKEN') + // Send the proper header information along with the request + xhr.setRequestHeader('X-CSRF-TOKEN', token) + xhr.send() +} + +/* function head() + * creates header and prepends it to the documents body + */ + +function head () { + const navheader = document.createElement('header') + navheader.id = 'header' + navheader.classList.add('clear') + + // disclaimer + const alertdiv = document.createElement('div') + alertdiv.classList.add('alert', 'alert-danger', 'alert-dismissible', 'fade', 'show') + alertdiv.style = 'text-align:center;' + alertdiv.innerHTML = '<strong>Disclaimer</strong> This website is under construction and in prototype-phase. It is not for public use.' + const alertbutton = document.createElement('button') + alertbutton.type = 'button' + alertbutton.classList.add('close') + alertbutton.setAttribute('data-dismiss', 'alert') + alertbutton.innerHTML = '×' + prependChild(alertdiv, alertbutton) + + // navigation header + const navbar = document.createElement('nav') + navbar.classList.add('navbar', 'navbar-expand-md', 'navbar-light') + navbar.style = 'background-color: #ffffff;' + + const navbarcontainer = document.createElement('div') + navbarcontainer.classList.add('container') + + const navbarheader = document.createElement('div') + navbarheader.classList.add('navbar-header') + // navigation header - logo + const link_m4lab = document.createElement('a') + link_m4lab.href = '/' + link_m4lab.classList.add('navbar-brand') + link_m4lab.innerHTML = "<img src='/img/header/Logozeile_Header.png' alt='Logo Innovationslabor M4_LAB'>" + navbarheader.appendChild(link_m4lab) + // navigation header - toggle button menu for mobile devices + const togglebutton = document.createElement('button') + togglebutton.classList.add('navbar-toggler') + togglebutton.type = 'button' + togglebutton.setAttribute('data-toggle', 'collapse') + togglebutton.setAttribute('data-target', '#navbarCollapse') + togglebutton.setAttribute('aria-controls', 'navbarCollapse') + togglebutton.setAttribute('aria-expanded', 'false') + togglebutton.setAttribute('aria-label', 'Toggle navigation') + togglebutton.innerHTML = "<span class='navbar-toggler-icon'></span>" + // nav menu + const navelements = document.createElement('ul') + navelements.id = 'navbarCollapse' + navelements.classList.add('collapse', 'nav', 'navbar-collapse', 'navbar-nav', 'justify-content-end') + for (let j = 0; j < menu.length; j++) { + const headitem = document.createElement('li') + const itemtype = menu[j].type + headitem.classList.add('nav-item') + const headlink = document.createElement('a') + headlink.href = menu[j].link + headlink.id = 'navbarDropdown' + j + headlink.classList.add('nav-link') + headlink.setAttribute('role', 'button') + if (itemtype == 'dropdown') { + headitem.classList.add('dropdown') + headlink.classList.add('dropdown-toggle') + headlink.setAttribute('data-toggle', 'dropdown') + headlink.setAttribute('aria-haspopup', 'true') + headlink.setAttribute('aria-expanded', 'false') + } + headlink.innerHTML = menu[j].name + if (itemtype == 'dropdown') { + const combodiv = document.createElement('div') + combodiv.id = headlink.id + '_par' + combodiv.setAttribute('aria-labelledby', headlink.id) + combodiv.classList.add('dropdown-menu') + for (let k = 0; k < menu[j].combos.length; k++) { + const combolink = document.createElement('a') + combolink.classList.add('dropdown-item') + combolink.href = menu[j].combos[k].link + combolink.innerHTML = menu[j].combos[k].name + combodiv.appendChild(combolink) + } + headitem.appendChild(combodiv) + } + prependChild(headitem, headlink) + navelements.appendChild(headitem) + } + + navbarcontainer.appendChild(navbarheader) + navbarcontainer.appendChild(togglebutton) + navbarcontainer.appendChild(navelements) + navbar.appendChild(navbarcontainer) + + navheader.appendChild(alertdiv) + navheader.appendChild(navbar) + prependChild(document.body, navheader) +} + +/* function foot() + * creates footer and appends it to the documents body + */ + +function foot () { + // add styles to <head> to manage sticky footer + const styles = ` + @media only screen and (min-width: 768px) { + html { + position: relative; + min-height: 100%; + } + body { + margin-bottom: 120px; /* Margin bottom by footer height */ + } + #homepage { + position: absolute; + bottom: 0; + width: 100%; + text-align: center; + } + } + ` + const styleSheet = document.createElement('style') + styleSheet.type = 'text/css' + styleSheet.innerText = styles + document.head.appendChild(styleSheet) + + const footerdiv = document.createElement('div') + footerdiv.id = 'homepage' + // footerdiv.classList.add("last", "clear"); + footerdiv.innerHTML = '<hr>' + const containerdiv = document.createElement('div') + containerdiv.classList.add('container') + const containerdivrow = document.createElement('div') + containerdivrow.classList.add('row') + + // bmbf + const bmbf = document.createElement('div') + bmbf.classList.add('col-md-auto') + bmbf.innerHTML = "<img src='/img/footer/Innovative_Hochschule_Initiative_BMBF_GWK_RGB.png' alt='Innovative Hochschule' style='height:90px'/>" + // m4labgrau + const m4labgrau = document.createElement('div') + m4labgrau.classList.add('col-md-auto') + m4labgrau.innerHTML = "<img src='/img/footer/M4_LAB_LOGO_Graustufen.png' alt='M4_LAB' style='height:80px'/>" + // socmed + const socialdiv = document.createElement('div') + socialdiv.classList.add('col-md-auto') + const socialrow = document.createElement('div') + socialrow.id = 'socialmediabuttons' + for (let j = 0; j < socialmedias.length; j++) { + const sociallink = document.createElement('a') + sociallink.href = socialmedias[j].url + const socialcontent = document.createElement('i') + socialcontent.classList.add('fab', socialmedias[j].name) + sociallink.appendChild(socialcontent) + socialrow.appendChild(sociallink) + socialrow.innerHTML += ' ' + } + socialdiv.appendChild(socialrow) + // contact + const contactdiv = document.createElement('div') + contactdiv.classList.add('col-md-auto', 'footer-unten') + contactdiv.innerHTML = 'Hochschule für Technik Stuttgart' + const rowdiv = document.createElement('div') + rowdiv.classList.add('row') + for (let i = 0; i < hft_links.length; i++) { + const coldiv = document.createElement('div') + coldiv.classList.add('contactrow', 'footer-unten') + const collink = document.createElement('a') + collink.innerHTML = hft_links[i].name + collink.classList.add('contact-lower') + collink.href = hft_links[i].url + coldiv.appendChild(collink) + rowdiv.appendChild(coldiv) + } + contactdiv.appendChild(rowdiv) + + containerdivrow.appendChild(bmbf) + containerdivrow.appendChild(m4labgrau) + containerdivrow.appendChild(socialdiv) + containerdivrow.appendChild(contactdiv) + + containerdiv.appendChild(containerdivrow) + footerdiv.appendChild(containerdiv) + document.body.appendChild(footerdiv) +} + +head() +foot() diff --git a/built/public/js/headfootLogout.js b/built/public/js/headfootLogout.js new file mode 100644 index 00000000..abeb03d2 --- /dev/null +++ b/built/public/js/headfootLogout.js @@ -0,0 +1,237 @@ +const menu = [{ name: 'Informationen', combos: [{ name: 'Projekte', link: '/project' }, { name: 'Ãœber das M4_LAB', link: '/projectoverview?projectID=1' }], type: 'dropdown', link: '#' }, { name: 'Zusammenarbeit', combos: [{ name: 'Mailinglisten', link: '/mailinglists' }, { name: 'Videokonferenzen', link: '/videoconference.html' }/* {'name':'...', 'link':'#'} */], type: 'dropdown', link: '#' }, { name: 'Events', combos: [{ name: 'Veranstaltungen der HfT', link: 'http://www.hft-stuttgart.de/Aktuell/Veranstaltungen/' }/*, {'name':'...', 'link':'#'} */], type: 'dropdown', link: '#' }, /* {'name':'Bürgerbeteiligung', 'combos':[{'name':'...', 'link':'#'}, {'name':'...', 'link':'#'}], 'type':'dropdown', 'link':'#'}, */{ name: 'Logout', combos: [], type: 'logoutbutton', link: '/logout' }] + +const hft_links = [{ url: 'http://www.hft-stuttgart.de/Forschung/M4-Lab/Team/index.html/de', name: 'Kontakt' }, { url: 'http://www.hft-stuttgart.de/Hochschule/Impressum.html/de', name: 'Impressum' }, { url: 'http://www.hft-stuttgart.de/Einrichtungen/Datenschutz/Datenschutz-Homepage', name: 'Datenschutz' }] + +const socialmedias = [{ url: 'https://twitter.com/InnolabM4', name: 'fa-twitter' }, { url: 'https://www.facebook.com/HfTStuttgart/', name: 'fa-facebook-square' }, { url: 'https://www.instagram.com/m4_lab/', name: 'fa-instagram' }, { url: 'https://de.linkedin.com/school/hochschule-f%C3%BCr-technik-stuttgart-%E2%80%93-university-of-applied-sciences/', name: 'fa-linkedin' }, { url: 'https://www.youtube.com/channel/UCi0_JfF2qMZbOhOnNH5PyHA', name: 'fa-youtube' }] + +const footer_images = [{ src: '/images/demo/Innovative_Hochschule_Initiative_BMBF_GWK_RGB.jpg', alt: 'Innovative Hochschule' }] + +function prependChild (parent, child) { + parent.insertBefore(child, parent.childNodes[0]) +} + +function userAuthenticated () { + const params = new URLSearchParams(window.location.search) + if (params.get('isAuthenticatedUser')) { + return true + } else if (document.getElementById('loginswitch')) { // relikt login via OAuth + if (document.getElementById('loginswitch').getAttribute('authenticated') == '1') { + return true + } + } else { + return false + } +} + +function readCookie (cname) { + const name = cname + '=' + const decodedCookie = decodeURIComponent(document.cookie) + const ca = decodedCookie.split(';') + for (let i = 0; i < ca.length; i++) { + let c = ca[i] + while (c.charAt(0) == ' ') { + c = c.substring(1) + } + if (c.indexOf(name) == 0) { + return c.substring(name.length, c.length) + } + } + return '' +} + +function sendRequest (URL) { + console.log(document.cookie) + const xhr = new XMLHttpRequest() + xhr.open('POST', URL, true) + const token = readCookie('XSRF-TOKEN') + // Send the proper header information along with the request + xhr.setRequestHeader('X-CSRF-TOKEN', token) + xhr.send() +} + +/* function head() + * creates header and prepends it to the documents body + */ + +function head () { + const headerdiv = document.createElement('div') + const alertdiv = document.createElement('div') + headerdiv.classList.add('wrapper', 'row1') + const navheader = document.createElement('header') + navheader.id = 'header' + navheader.classList.add('clear') + const alertbutton = document.createElement('button') + alertbutton.type = 'button' + alertbutton.classList.add('close') + alertbutton.setAttribute('data-dismiss', 'alert') + alertbutton.innerHTML = '×' + alertdiv.innerHTML = '<strong>Disclaimer</strong> This website is under construction and in prototype-phase. It is not for public use.' + prependChild(alertdiv, alertbutton) + alertdiv.classList.add('alert', 'alert-danger', 'alert-dismissible', 'fade', 'show', 'text-center') + // alertdiv.style = "text-align:center;"; + navheader.appendChild(alertdiv) + const navbar = document.createElement('nav') + navbar.classList.add('navbar', 'navbar-default') + const fluiddiv = document.createElement('div') + fluiddiv.classList.add('container-fluid') + const navbardiv = document.createElement('div') + navbardiv.classList.add('navbar-header') + const navelements = document.createElement('ul') + navelements.id = 'navelemente' + const logos = document.createElement('li') + const link_m4lab = document.createElement('a') + link_m4lab.href = '/' + link_m4lab.innerHTML = "<img src='/images/demo/m4lab_logo.jpg' alt='Logo Innovationslabor M4_LAB'>" + logos.appendChild(link_m4lab) + navelements.appendChild(logos) + for (let j = 0; j < menu.length; j++) { + const headitem = document.createElement('li') + const itemtype = menu[j].type + headitem.classList.add('nav-item') + const headlink = document.createElement('a') + headlink.href = menu[j].link + headlink.id = 'navbarDropdown' + j + headlink.classList.add('nav-link') + headlink.setAttribute('role', 'button') + if (itemtype == 'dropdown') { + headitem.classList.add('dropdown') + headlink.classList.add('dropdown-toggle') + headlink.setAttribute('data-toggle', 'dropdown') + headlink.setAttribute('aria-haspopup', 'true') + headlink.setAttribute('aria-expanded', 'false') + } + headlink.innerHTML = menu[j].name + if (itemtype == 'dropdown') { + const combodiv = document.createElement('div') + combodiv.id = headlink.id + '_par' + combodiv.setAttribute('aria-labelledby', headlink.id) + combodiv.classList.add('dropdown-menu') + for (let k = 0; k < menu[j].combos.length; k++) { + const combolink = document.createElement('a') + combolink.classList.add('dropdown-item') + if (userAuthenticated() || typeof user !== 'undefined') { // either logged in the old way or logged in using SAML + if (menu[j].combos[k].link.includes('?')) { + combolink.href = menu[j].combos[k].link + '&isAuthenticatedUser=true' + } else { + combolink.href = menu[j].combos[k].link + '?isAuthenticatedUser=true' + } + } else { + combolink.href = menu[j].combos[k].link + } + combolink.innerHTML = menu[j].combos[k].name + combodiv.appendChild(combolink) + } + headitem.appendChild(combodiv) + } else if (itemtype == 'logoutbutton') { + /* if(userAuthenticated()){ + headlink.innerHTML="Account"; + headlink.href="/account/"; + } */ + headlink.innerHTML = 'Logout' + headlink.href = '/logout' + headlink.classList.remove('nav-link') + headlink.classList.add('btn') + headlink.classList.add('btn-outline-danger') + } + headitem.appendChild(headlink) + navelements.appendChild(headitem) + } + /* let searchitem = document.createElement('li'); + searchitem.classList.add("nav-item"); + let searchinput = document.createElement('input'); + searchinput.value='Suche...' + searchinput.type="text"; + searchinput.classList.add("nav-item-suchfeld"); + searchinput.setAttribute('onFocus', "this.value=(this.value=='search...')? '' : this.value"); + searchitem.appendChild(searchinput); + let magnifier = document.createElement('input'); + magnifier.type="image" + magnifier.src="/images/Lupe_grau.png"; + magnifier.width="25"; + magnifier.height="25"; + magnifier.alt=""; + magnifier.id="sf_submit"; + magnifier.value="search"; + searchitem.appendChild(magnifier); + navelements.appendChild(searchitem); */ + navbardiv.appendChild(navelements) + fluiddiv.appendChild(navbardiv) + navbar.appendChild(fluiddiv) + navheader.appendChild(navbar) + headerdiv.appendChild(navheader) + prependChild(document.body, headerdiv) +}; + +/* function foot() + * creates footer and appends it to the documents body + */ + +function foot () { + const footerdiv = document.createElement('div') + footerdiv.id = 'homepage' + footerdiv.classList.add('last', 'clear') + footerdiv.innerHTML = '<hr>' + const containerdiv = document.createElement('div') + containerdiv.classList.add('flex-container') + const hftlink = document.createElement('a') + hftlink.classList.add('col-md-3') + hftlink.setAttribute('style', 'flex-basis: 400px;') + hftlink.href = 'https://www.hft-stuttgart.de' + const hftimage = document.createElement('img') + hftimage.src = '/images/demo/hft_logo.jpg' + hftimage.alt = 'Logo der Hochschule für Technik Stuttgart' + hftimage.height = '75' + hftlink.appendChild(hftimage) + containerdiv.appendChild(hftlink) + const contactdiv = document.createElement('div') + contactdiv.classList.add('col-md-3', 'footer-unten') + contactdiv.setAttribute('style', 'flex-basis:400px') + contactdiv.innerHTML = 'Hochschule für Technik Stuttgart' + const rowdiv = document.createElement('div') + rowdiv.classList.add('row') + for (let i = 0; i < hft_links.length; i++) { + const coldiv = document.createElement('div') + coldiv.classList.add('contactrow', 'footer-unten') + const collink = document.createElement('a') + collink.innerHTML = hft_links[i].name + collink.classList.add('contact-lower') + collink.href = hft_links[i].url + coldiv.appendChild(collink) + rowdiv.appendChild(coldiv) + } + contactdiv.appendChild(rowdiv) + containerdiv.appendChild(contactdiv) + const socialdiv = document.createElement('div') + socialdiv.classList.add('col-md-3') + socialdiv.setAttribute('style', 'flex-basis: 400px;') + const socialrow = document.createElement('div') + socialrow.id = 'socialmediabuttons' + for (let j = 0; j < socialmedias.length; j++) { + const sociallink = document.createElement('a') + sociallink.href = socialmedias[j].url + const socialcontent = document.createElement('i') + socialcontent.classList.add('fab', socialmedias[j].name) + sociallink.appendChild(socialcontent) + socialrow.appendChild(sociallink) + socialrow.innerHTML += ' ' + } + socialdiv.appendChild(socialrow) + containerdiv.appendChild(socialdiv) + const imagediv = document.createElement('div') + imagediv.classList.add('col-md-3') + imagediv.setAttribute('style', 'flex-basis:400px;') + for (let k = 0; k < footer_images.length; k++) { + const image = document.createElement('img') + image.src = footer_images[k].src + image.width = '300' + image.height = '73' + image.alt = footer_images[k].alt + imagediv.appendChild(image) + } + containerdiv.appendChild(imagediv) + footerdiv.appendChild(containerdiv) + document.body.appendChild(footerdiv) +}; + +head() +foot() diff --git a/built/public/js/registration.js b/built/public/js/registration.js new file mode 100644 index 00000000..c8f6aefe --- /dev/null +++ b/built/public/js/registration.js @@ -0,0 +1,37 @@ +let isEmailValid = false +let isPasswordValid = false + +// check if email already exist +$('#inputEmail').change(function () { + const email = $('#inputEmail').val() + $.get('email/' + email, function (data) { + $('#emailWarning').empty() + isEmailValid = data + if (!isEmailValid) { + $('#emailWarning').html('Mit dieser E-Mail-Adresse existiert bereits ein Benutzerkonto in unserem Transferportal.') + } + switchSubmitButton() + }) + .fail(function () { + console.log('cannot check email') + }) +}) + +// check password +$('#inputPassword').on('keyup', function () { + isPasswordValid = checkPasswordReq($('#inputPassword').val()) + $('#passwordWarning').empty() + if (!isPasswordValid) { + // $('#passwordWarning').html('Must be at least 8 characters') + $('#passwordWarning').html('Das Passwort muss mindestens 8 Zeichen haben') + } + switchSubmitButton() +}) + +function switchSubmitButton () { + if (isEmailValid && isPasswordValid) { + $('#submitBtn').prop('disabled', false) + } else { + $('#submitBtn').prop('disabled', true) + } +} diff --git a/built/public/js/security.js b/built/public/js/security.js new file mode 100644 index 00000000..5d71fb8a --- /dev/null +++ b/built/public/js/security.js @@ -0,0 +1,30 @@ +// check password and password confirmation input fields +// used in Security and Reset Password +$('#inputNewPwd, #inputConfirm').on('keyup', function () { + let isBest, isMatch + + isBest = checkPasswordReq($('#inputNewPwd').val()) + $('#recommendation').empty() + if (!isBest) { + // $('#recommendation').html('Must be at least 8 characters').css('color', 'red'); + $('#recommendation').html('Das Passwort muss mindestens 8 Zeichen haben').css('color', 'red') + } + + // match or not? + if ($('#inputNewPwd').val() === $('#inputConfirm').val()) { + // $('#message').html('Matching').css('color', 'green'); + $('#message').html('Ãœbereinstimmend').css('color', 'green') + isMatch = true + } else { + // $('#message').html('Not Matching').css('color', 'red'); + $('#message').html('Nicht übereinstimmend').css('color', 'red') + isMatch = false + } + + // enable/disable update button + if (isBest && isMatch) { + $('#updateBtn').prop('disabled', false) + } else { + $('#updateBtn').prop('disabled', true) + } +}) diff --git a/built/routes/account.js b/built/routes/account.js new file mode 100644 index 00000000..6ac96a26 --- /dev/null +++ b/built/routes/account.js @@ -0,0 +1,12 @@ +"use strict";function _typeof(a){"@babel/helpers - typeof";return _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(a){return typeof a}:function(a){return a&&"function"==typeof Symbol&&a.constructor===Symbol&&a!==Symbol.prototype?"symbol":typeof a},_typeof(a)}var _fs=_interopRequireDefault(require("fs")),_async=_interopRequireDefault(require("async")),_bcryptjs=_interopRequireDefault(require("bcryptjs")),passportSaml=_interopRequireWildcard(require("passport-saml")),_dbconn=require("../config/dbconn"),_dbController=require("../controller/dbController"),_gitlabController=require("../controller/gitlabController"),_const=require("../config/const"),_mailer=require("../config/mailer"),_user=require("../classes/user"),_website=require("../classes/website"),_repo=require("../classes/repo");function _getRequireWildcardCache(a){if("function"!=typeof WeakMap)return null;var b=new WeakMap,c=new WeakMap;return(_getRequireWildcardCache=function(a){return a?c:b})(a)}function _interopRequireWildcard(a,b){if(!b&&a&&a.__esModule)return a;if(null===a||"object"!==_typeof(a)&&"function"!=typeof a)return{default:a};var c=_getRequireWildcardCache(b);if(c&&c.has(a))return c.get(a);var d={},e=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var f in a)if("default"!=f&&Object.prototype.hasOwnProperty.call(a,f)){var g=e?Object.getOwnPropertyDescriptor(a,f):null;g&&(g.get||g.set)?Object.defineProperty(d,f,g):d[f]=a[f]}return d["default"]=a,c&&c.set(a,d),d}function _interopRequireDefault(a){return a&&a.__esModule?a:{default:a}}function _regeneratorRuntime(){"use strict";/*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */function a(a,b,c){return Object.defineProperty(a,b,{value:c,enumerable:!0,configurable:!0,writable:!0}),a[b]}function b(a,b,e,f){var g=b&&b.prototype instanceof d?b:d,h=Object.create(g.prototype),j=new l(f||[]);return h._invoke=function(a,b,d){var e="suspendedStart";return function(f,g){if("executing"===e)throw new Error("Generator is already running");if("completed"===e){if("throw"===f)throw g;return n()}for(d.method=f,d.arg=g;;){var h=d.delegate;if(h){var j=i(h,d);if(j){if(j===v)continue;return j}}if("next"===d.method)d.sent=d._sent=d.arg;else if("throw"===d.method){if("suspendedStart"===e)throw e="completed",d.arg;d.dispatchException(d.arg)}else"return"===d.method&&d.abrupt("return",d.arg);e="executing";var k=c(a,b,d);if("normal"===k.type){if(e=d.done?"completed":"suspendedYield",k.arg===v)continue;return{value:k.arg,done:d.done}}"throw"===k.type&&(e="completed",d.method="throw",d.arg=k.arg)}}}(a,e,j),h}function c(a,b,c){try{return{type:"normal",arg:a.call(b,c)}}catch(a){return{type:"throw",arg:a}}}function d(){}function e(){}function f(){}function g(b){["next","throw","return"].forEach(function(c){a(b,c,function(a){return this._invoke(c,a)})})}function h(a,b){function d(e,f,g,h){var i=c(a[e],a,f);if("throw"!==i.type){var j=i.arg,k=j.value;return k&&"object"==_typeof(k)&&q.call(k,"__await")?b.resolve(k.__await).then(function(a){d("next",a,g,h)},function(a){d("throw",a,g,h)}):b.resolve(k).then(function(a){j.value=a,g(j)},function(a){return d("throw",a,g,h)})}h(i.arg)}var e;this._invoke=function(a,c){function f(){return new b(function(b,e){d(a,c,b,e)})}return e=e?e.then(f,f):f()}}function i(a,b){var d=a.iterator[b.method];if(void 0===d){if(b.delegate=null,"throw"===b.method){if(a.iterator["return"]&&(b.method="return",b.arg=void 0,i(a,b),"throw"===b.method))return v;b.method="throw",b.arg=new TypeError("The iterator does not provide a 'throw' method")}return v}var e=c(d,a.iterator,b.arg);if("throw"===e.type)return b.method="throw",b.arg=e.arg,b.delegate=null,v;var f=e.arg;return f?f.done?(b[a.resultName]=f.value,b.next=a.nextLoc,"return"!==b.method&&(b.method="next",b.arg=void 0),b.delegate=null,v):f:(b.method="throw",b.arg=new TypeError("iterator result is not an object"),b.delegate=null,v)}function j(a){var b={tryLoc:a[0]};1 in a&&(b.catchLoc=a[1]),2 in a&&(b.finallyLoc=a[2],b.afterLoc=a[3]),this.tryEntries.push(b)}function k(a){var b=a.completion||{};b.type="normal",delete b.arg,a.completion=b}function l(a){this.tryEntries=[{tryLoc:"root"}],a.forEach(j,this),this.reset(!0)}function m(a){if(a){var b=a[s];if(b)return b.call(a);if("function"==typeof a.next)return a;if(!isNaN(a.length)){var c=-1,d=function b(){for(;++c<a.length;)if(q.call(a,c))return b.value=a[c],b.done=!1,b;return b.value=void 0,b.done=!0,b};return d.next=d}}return{next:n}}function n(){return{value:void 0,done:!0}}_regeneratorRuntime=function(){return o};var o={},p=Object.prototype,q=p.hasOwnProperty,r="function"==typeof Symbol?Symbol:{},s=r.iterator||"@@iterator",t=r.asyncIterator||"@@asyncIterator",u=r.toStringTag||"@@toStringTag";try{a({},"")}catch(b){a=function(a,b,c){return a[b]=c}}o.wrap=b;var v={},w={};a(w,s,function(){return this});var x=Object.getPrototypeOf,y=x&&x(x(m([])));y&&y!==p&&q.call(y,s)&&(w=y);var z=f.prototype=d.prototype=Object.create(w);return e.prototype=f,a(z,"constructor",f),a(f,"constructor",e),e.displayName=a(f,u,"GeneratorFunction"),o.isGeneratorFunction=function(a){var b="function"==typeof a&&a.constructor;return!!b&&(b===e||"GeneratorFunction"===(b.displayName||b.name))},o.mark=function(b){return Object.setPrototypeOf?Object.setPrototypeOf(b,f):(b.__proto__=f,a(b,u,"GeneratorFunction")),b.prototype=Object.create(z),b},o.awrap=function(a){return{__await:a}},g(h.prototype),a(h.prototype,t,function(){return this}),o.AsyncIterator=h,o.async=function(a,c,d,e,f){void 0===f&&(f=Promise);var g=new h(b(a,c,d,e),f);return o.isGeneratorFunction(c)?g:g.next().then(function(a){return a.done?a.value:g.next()})},g(z),a(z,u,"Generator"),a(z,s,function(){return this}),a(z,"toString",function(){return"[object Generator]"}),o.keys=function(a){var b=[];for(var c in a)b.push(c);return b.reverse(),function c(){for(;b.length;){var d=b.pop();if(d in a)return c.value=d,c.done=!1,c}return c.done=!0,c}},o.values=m,l.prototype={constructor:l,reset:function reset(a){if(this.prev=0,this.next=0,this.sent=this._sent=void 0,this.done=!1,this.delegate=null,this.method="next",this.arg=void 0,this.tryEntries.forEach(k),!a)for(var b in this)"t"===b.charAt(0)&&q.call(this,b)&&!isNaN(+b.slice(1))&&(this[b]=void 0)},stop:function stop(){this.done=!0;var a=this.tryEntries[0].completion;if("throw"===a.type)throw a.arg;return this.rval},dispatchException:function dispatchException(a){function b(b,d){return f.type="throw",f.arg=a,c.next=b,d&&(c.method="next",c.arg=void 0),!!d}if(this.done)throw a;for(var c=this,d=this.tryEntries.length-1;0<=d;--d){var e=this.tryEntries[d],f=e.completion;if("root"===e.tryLoc)return b("end");if(e.tryLoc<=this.prev){var g=q.call(e,"catchLoc"),h=q.call(e,"finallyLoc");if(g&&h){if(this.prev<e.catchLoc)return b(e.catchLoc,!0);if(this.prev<e.finallyLoc)return b(e.finallyLoc)}else if(!g){if(!h)throw new Error("try statement without catch or finally");if(this.prev<e.finallyLoc)return b(e.finallyLoc)}else if(this.prev<e.catchLoc)return b(e.catchLoc,!0)}}},abrupt:function abrupt(a,b){for(var c,d=this.tryEntries.length-1;0<=d;--d)if(c=this.tryEntries[d],c.tryLoc<=this.prev&&q.call(c,"finallyLoc")&&this.prev<c.finallyLoc){var e=c;break}e&&("break"===a||"continue"===a)&&e.tryLoc<=b&&b<=e.finallyLoc&&(e=null);var f=e?e.completion:{};return f.type=a,f.arg=b,e?(this.method="next",this.next=e.finallyLoc,v):this.complete(f)},complete:function complete(a,b){if("throw"===a.type)throw a.arg;return"break"===a.type||"continue"===a.type?this.next=a.arg:"return"===a.type?(this.rval=this.arg=a.arg,this.method="return",this.next="end"):"normal"===a.type&&b&&(this.next=b),v},finish:function finish(a){for(var b,c=this.tryEntries.length-1;0<=c;--c)if(b=this.tryEntries[c],b.finallyLoc===a)return this.complete(b.completion,b.afterLoc),k(b),v},catch:function _catch(a){for(var b,c=this.tryEntries.length-1;0<=c;--c)if(b=this.tryEntries[c],b.tryLoc===a){var d=b.completion;if("throw"===d.type){var e=d.arg;k(b)}return e}throw new Error("illegal catch attempt")},delegateYield:function delegateYield(a,b,c){return this.delegate={iterator:m(a),resultName:b,nextLoc:c},"next"===this.method&&(this.arg=void 0),v}},o}function asyncGeneratorStep(a,b,c,d,e,f,g){try{var h=a[f](g),i=h.value}catch(a){return void c(a)}h.done?b(i):Promise.resolve(i).then(d,e)}function _asyncToGenerator(a){return function(){var b=this,c=arguments;return new Promise(function(d,e){function f(a){asyncGeneratorStep(h,d,e,f,g,"next",a)}function g(a){asyncGeneratorStep(h,d,e,f,g,"throw",a)}var h=a.apply(b,c);f(void 0)})}}var SamlStrategy=passportSaml.Strategy,saltRounds=10,salt=64,logoDir="public/upload/",defaultLogo="public/default/logo.png";module.exports=function(a,b,c,d){// ======== APP ROUTES - ACCOUNT ==================== +function e(){return f.apply(this,arguments)}function f(){return f=_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function b(a){var c,d,e;return _regeneratorRuntime().wrap(function f(b){for(;1;)switch(b.prev=b.next){case 0:return b.next=2,_dbController.dbController.getUserByEmail(a);case 2:if(c=b.sent,c){b.next=8;break}return console.log("no user found"),b.abrupt("return",null);case 8:return d=new _user.User(c.id,a,c.salutation,c.title,c.firstname,c.lastname,c.industry,c.organisation,c.speciality,c.m4lab_idp,c.verificationStatus),b.next=11,_dbController.dbController.getGitlabId(d.id);case 11:return e=b.sent,e&&d.setGitlabUserId(e),b.abrupt("return",d);case 14:case"end":return b.stop();}},b)})),f.apply(this,arguments)}c.serializeUser(function(a,b){b(null,a)}),c.deserializeUser(function(a,b){b(null,a)});var g=new SamlStrategy({// URL that goes from the Identity Provider -> Service Provider +callbackUrl:b.passport.saml.path,// Base address to call logout requests +logoutUrl:b.passport.saml.logoutUrl,entryPoint:b.passport.saml.entryPoint,issuer:b.passport.saml.issuer,identifierFormat:void 0,// Service Provider private key +decryptionPvk:_fs["default"].readFileSync(__dirname+"/cert/key.pem","utf8"),// Service Provider Certificate +privateKey:_fs["default"].readFileSync(__dirname+"/cert/key.pem","utf8"),// Identity Provider's public key +cert:_fs["default"].readFileSync(__dirname+"/cert/cert_idp.pem","utf8"),validateInResponseTo:!1,disableRequestedAuthnContext:!0},function(a,b){return b(null,{id:a.nameID,idFormat:a.nameIDFormat,email:a.email,firstName:a.givenName,lastName:a.sn})});// ============= SAML ============== +// to generate Service Provider's XML metadata +// ============= NEW GITLAB PAGES =========================== +// update a website +c.use(g),a.post(b.passport.saml.path,c.authenticate(b.passport.strategy,{failureRedirect:"/account/",failureFlash:!0}),function(a,b){b.redirect("/account/")}),a.get("/saml/metadata",function(a,b){b.type("application/xml");var c=g.generateServiceProviderMetadata(_fs["default"].readFileSync(__dirname+"/cert/cert.pem","utf8"));b.status(200).send(c)}),a.get("/",/*#__PURE__*/function(){var a=_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function c(a,b){var f;return _regeneratorRuntime().wrap(function g(c){for(;1;)switch(c.prev=c.next){case 0:if(a.isAuthenticated()){c.next=4;break}b.redirect("/login"),c.next=8;break;case 4:return c.next=6,e(a.user.email);case 6:f=c.sent,null==f?(console.error("user data is not found"),b.status(500).render(d+"/500",{error:"Your data is not found. Please try again."})):b.render(d+"/account/home",{user:f});case 8:case"end":return c.stop();}},c)}));return function(b,c){return a.apply(this,arguments)}}()),a.get("/login",c.authenticate(b.passport.strategy,{successRedirect:"/",failureRedirect:"/login"})),a.get("/logout",function(a,b){return null==a.user?b.redirect("/"):(a.user.nameID=a.user.id,a.user.nameIDFormat=a.user.idFormat,g.logout(a,function(c,d){return a.logout(),a.session&&a.session.destroy(function(a){if(a)return console.log(a)}),b.redirect(d)}))}),a.get("/profile",/*#__PURE__*/function(){var a=_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function c(a,b){var f;return _regeneratorRuntime().wrap(function g(c){for(;1;)switch(c.prev=c.next){case 0:if(a.isAuthenticated()){c.next=4;break}b.redirect("/login"),c.next=8;break;case 4:return c.next=6,e(a.user.email);case 6:f=c.sent,null==f?b.redirect("/account/"):1===f.getVerificationStatus()?b.render(d+"/account/profile",{user:f}):b.redirect("/account/");case 8:case"end":return c.stop();}},c)}));return function(b,c){return a.apply(this,arguments)}}()),a.get("/services",/*#__PURE__*/function(){var a=_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function c(a,b){var f,g,h,i,j,k,l,m,n;return _regeneratorRuntime().wrap(function o(c){for(;1;)switch(c.prev=c.next){case 0:if(a.isAuthenticated()){c.next=4;break}b.redirect("/login"),c.next=45;break;case 4:return c.next=6,e(a.user.email);case 6:if(f=c.sent,null!=f){c.next=11;break}b.redirect("/account/"),c.next=45;break;case 11:if(1===f.getVerificationStatus()){c.next=15;break}b.redirect("/account/"),c.next=45;break;case 15:if(g=[],h=[],!f.getGitlabUserId()){c.next=41;break}return c.next=20,_gitlabController.gitlabController.getUserProjects(f.getGitlabUserId());case 20:if(i=c.sent,!i){c.next=38;break}c.t0=_regeneratorRuntime().keys(i);case 23:if((c.t1=c.t0()).done){c.next=38;break}if(j=c.t1.value,!i[j].tag_list.includes("website")){c.next=34;break}return c.t2=new _website.Website(f.getGitlabUserId(),i[j].name,i[j].description,i[j].id,i[j].avatar_url,i[j].path_with_namespace),c.next=29,_gitlabController.gitlabController.getProjectPipelineLatestStatus(i[j].id);case 29:c.t3=c.sent,k={projectInformation:c.t2,pipelineStatus:c.t3},h.push(k),c.next=36;break;case 34:l=new _repo.Repo(f.getGitlabUserId(),i[j].name,i[j].description,i[j].id,i[j].avatar_url,i[j].path_with_namespace),g.push(l);case 36:c.next=23;break;case 38:b.render(d+"/account/services",{user:f,gitlabRepos:g,gitlabPages:h}),c.next=45;break;case 41:return c.next=43,_gitlabController.gitlabController.getUserByEmail(f.getEmail());case 43:m=c.sent,m?(n={user_id:f.getId(),gitlab_userId:m.id},_dbController.dbController.addGitlabUser(n,function(a){a?b.status(500).render(d+"/500",{error:a}):b.redirect("/account/services")})):b.render(d+"/account/services",{user:f,gitlabRepos:null,gitlabPages:null});case 45:case"end":return c.stop();}},c)}));return function(b,c){return a.apply(this,arguments)}}()),a.get("/security",/*#__PURE__*/function(){var a=_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function c(a,b){var f;return _regeneratorRuntime().wrap(function g(c){for(;1;)switch(c.prev=c.next){case 0:if(a.isAuthenticated()){c.next=4;break}b.redirect("/login"),c.next=8;break;case 4:return c.next=6,e(a.user.email);case 6:f=c.sent,null==f?b.redirect("/account/"):1===f.getVerificationStatus()&&1===f.getIdpStatus()?b.render(d+"/account/security",{user:f}):b.redirect("/account/");case 8:case"end":return c.stop();}},c)}));return function(b,c){return a.apply(this,arguments)}}()),a.post("/updateProfile",/*#__PURE__*/function(){var a=_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function c(a,b){var d,f,g;return _regeneratorRuntime().wrap(function h(c){for(;1;)switch(c.prev=c.next){case 0:if(a.isAuthenticated()){c.next=4;break}b.redirect("/login"),c.next=17;break;case 4:return c.next=6,e(a.user.email);case 6:if(d=c.sent,null!=d){c.next=11;break}b.redirect("/account/"),c.next=17;break;case 11:return f={salutation:a.body.inputSalutation,title:a.body.inputTitle,firstname:a.body.inputFirstname,lastname:a.body.inputLastname,email:a.body.inputEmail,organisation:a.body.inputOrganisation,industry:a.body.inputIndustry,speciality:a.body.inputSpeciality},c.next=14,_dbController.dbController.updateUserById(d.getId(),f);case 14:g=c.sent,g?(d.updateProfile(f.salutation,f.title,f.firstname,f.lastname,f.email,f.organisation,f.industry,f.speciality),b.flash("success","Ihr Benutzerprofil wurde aktualisiert!")):b.flash("error","Failed"),b.redirect("/account/profile");case 17:case"end":return c.stop();}},c)}));return function(b,c){return a.apply(this,arguments)}}()),a.post("/changePwd",/*#__PURE__*/function(){var a=_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function c(a,b){var f,g,h,i;return _regeneratorRuntime().wrap(function j(c){for(;1;)switch(c.prev=c.next){case 0:if(a.isAuthenticated()){c.next=4;break}b.redirect("/login"),c.next=8;break;case 4:return c.next=6,e(a.user.email);case 6:f=c.sent,null==f?b.redirect("/account/"):(g=a.body.inputCurrPwd,h=a.body.inputNewPwd,i=a.body.inputConfirm,_dbconn.dbConnection.user.query("SELECT password FROM credential WHERE user_id="+f.getId(),function(a,c){a&&(console.error(a),b.status(500).render(d+"/500",{error:a}));var e=c[0].password;// check if the password is correct +_bcryptjs["default"].compare(g,e,function(a,c){a?(console.error(a),b.status(500).render(d+"/500",{error:a})):c?h===i?_bcryptjs["default"].genSalt(saltRounds,function(a,c){_bcryptjs["default"].hash(h,c,/*#__PURE__*/function(){var a=_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function d(a,c){var e,g;return _regeneratorRuntime().wrap(function d(a){for(;1;)switch(a.prev=a.next){case 0:return e={password:c,user_id:f.getId()},a.next=3,_dbController.dbController.updateCredential(e);case 3:g=a.sent,g?(b.flash("success","Passwort aktualisiert!"),_mailer.mailer.options.to=f.getEmail(),_mailer.mailer.options.subject=_const.miscConst.updatePasswordMailSubject,_mailer.mailer.options.html=_const.miscConst.updatePasswordMailContent+"<div>"+_const.miscConst.mailSignature+"</div>",_mailer.mailer.transporter.sendMail(_mailer.mailer.options,function(a){a&&console.log(a)})):(console.log("Failed to reset password"),b.flash("error","Datenbankfehler: Passwort kann nicht ge\xE4ndert werden.")),b.redirect("/account/security");case 6:case"end":return a.stop();}},d)}));return function(b,c){return a.apply(this,arguments)}}())}):(b.flash("error","Passw\xF6rter stimmen nicht \xFCberein. Bitte stellen Sie sicher, dass Sie das Passwort beide Male genau gleich eingeben."),b.redirect("/account/security")):(b.flash("error","Das Passwort ist leider falsch. Bitte \xFCberpr\xFCfen Sie Ihre Eingabe."),b.redirect("/account/security"))})}));case 8:case"end":return c.stop();}},c)}));return function(b,c){return a.apply(this,arguments)}}()),a.get("/resendVerificationEmail",/*#__PURE__*/function(){var a=_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function d(a,c){var f,g,h,i;return _regeneratorRuntime().wrap(function j(d){for(;1;)switch(d.prev=d.next){case 0:if(a.isAuthenticated){d.next=4;break}c.redirect("/login"),d.next=15;break;case 4:return d.next=6,e(a.user.email);case 6:if(f=d.sent,null!=f){d.next=11;break}c.redirect("/login"),d.next=15;break;case 11:return d.next=13,_dbController.dbController.getVerificationTokenByUserId(f.id);case 13:g=d.sent,g?(h="Bitte best\xE4tigen Sie Ihr M4_LAB Benutzerkonto",i="<div>Lieber Nutzer,<br/><br/><p>vielen Dank f\xFCr Ihre Anmeldung am Transferportal der HFT Stuttgart. <br/>Um Ihre Anmeldung zu best\xE4tigen, klicken Sie bitte diesen Link: "+b.app.host+"/verifyAccount?token="+g+"<br/><br/>Ohne Best\xE4tigung Ihres Kontos m\xFCssen wir Ihr Konto leider nach 7 Tagen l\xF6schen.</p><br/>"+_const.miscConst.mailSignature+"</div>",_mailer.mailer.options.to=f.email,_mailer.mailer.options.subject=h,_mailer.mailer.options.html=i,_mailer.mailer.transport.sendMail(_mailer.mailer.options,function(a){if(a)throw console.log("cannot send email"),a}),c.send(!0)):c.send(!1);case 15:case"end":return d.stop();}},d)}));return function(b,c){return a.apply(this,arguments)}}()),a.get("/newInformation",/*#__PURE__*/function(){var a=_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function c(a,b){var f,g;return _regeneratorRuntime().wrap(function h(c){for(;1;)switch(c.prev=c.next){case 0:if(a.isAuthenticated()){c.next=4;break}b.redirect("/login"),c.next=15;break;case 4:return c.next=6,e(a.user.email);case 6:if(f=c.sent,null!=f){c.next=11;break}b.redirect("/login"),c.next=15;break;case 11:return c.next=13,_gitlabController.gitlabController.getUserByEmail(f.getEmail());case 13:g=c.sent,g?b.render(d+"/account/newInformation",{user:f,gitlabUsername:g.username}):b.redirect("/account/services");case 15:case"end":return c.stop();}},c)}));return function(b,c){return a.apply(this,arguments)}}()),a.post("/newInformation",/*#__PURE__*/function(){var a=_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function c(a,b){var d,f,g,h,i,j;return _regeneratorRuntime().wrap(function k(c){for(;1;)switch(c.prev=c.next){case 0:if(a.isAuthenticated()){c.next=4;break}b.redirect("/login"),c.next=8;break;case 4:return c.next=6,e(a.user.email);case 6:d=c.sent,null==d?b.redirect("/login"):a.body.name||a.body.description?(f=a.body.name.toLowerCase().replace(/\s/g,"-"),g=a.body.description,h=a.body.template,i=new _website.Website(d.getGitlabUserId(),f,g),j=defaultLogo,a.files&&(j=a.files.logo),_async["default"].waterfall([function(b){a.files?j.mv(logoDir+j.name,function(a){j=logoDir+j.name,b(a,j)}):b(null,j)},/*#__PURE__*/function(){var a=_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function c(a){var d;return _regeneratorRuntime().wrap(function e(c){for(;1;)switch(c.prev=c.next){case 0:return c.next=2,_gitlabController.gitlabController.createNewPages(i,a,h);case 2:d=c.sent,d.status?("has already been taken"===d.data.message.name?b.flash("error","Der Projektname '"+i.getName()+"' ist bereits vergeben, bitte w\xE4hlen Sie einen anderen Namen."):b.flash("error","Ein Fehler ist aufgetreten. Bitte versuchen Sie es erneut.\xA0"),b.redirect("/account/newInformation")):(b.flash("success","Ihre Webseite wurde erstellt, aber noch nicht ver\xF6ffentlicht. Um Ihre Webseite endg\xFCltig zu ver\xF6ffentlichen, schlie\xDFen Sie die Einrichtung gem\xE4\xDF unten stehender Anleitung ab."),b.redirect("/account/updateInformation?id="+(d.id+"")));case 4:case"end":return c.stop();}},c)}));return function(b){return a.apply(this,arguments)}}()],function(b){null!=b&&console.log(b),a.files&&_fs["default"].unlink(j,function(a){null!=a&&console.log(a)})})):(b.flash("error","Bitte geben Sie die ben\xF6tigten Daten ein"),b.redirect("/account/newInformation"));case 8:case"end":return c.stop();}},c)}));return function(b,c){return a.apply(this,arguments)}}()),a.get("/updateInformation",/*#__PURE__*/function(){var a=_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function c(a,b){var f,g,h;return _regeneratorRuntime().wrap(function i(c){for(;1;)switch(c.prev=c.next){case 0:if(a.isAuthenticated()){c.next=4;break}b.redirect("/login"),c.next=19;break;case 4:return c.next=6,e(a.user.email);case 6:if(f=c.sent,null!=f){c.next=11;break}b.redirect("/login"),c.next=19;break;case 11:if(a.query.id){c.next=15;break}b.redirect("/account/services"),c.next=19;break;case 15:return c.next=17,_gitlabController.gitlabController.getProjectById(a.query.id);case 17:g=c.sent,g?g.owner?g.owner.id===f.getGitlabUserId()?(h=new _website.Website(f.getGitlabUserId(),g.name,g.description,a.query.id,g.avatar_url,g.path_with_namespace),b.render(d+"/account/updateInformation",{user:f,information:h})):(console.log(" ========= Access denied: Not your project"),b.redirect("/account/services")):(console.log(" ========= Project cannot be accessed, since it does not have an owner"),b.redirect("/account/services")):(console.log(" ========= Error or no project found"),b.redirect("/account/services"));case 19:case"end":return c.stop();}},c)}));return function(b,c){return a.apply(this,arguments)}}()),a.post("/updateInformation",/*#__PURE__*/function(){var a=_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function c(a,b){var d,f,g,h,i;return _regeneratorRuntime().wrap(function j(c){for(;1;)switch(c.prev=c.next){case 0:if(a.isAuthenticated()){c.next=4;break}b.redirect("/login"),c.next=8;break;case 4:return c.next=6,e(a.user.email);case 6:d=c.sent,null==d?b.redirect("/login"):a.body.name||a.body.description?(f=a.body.name.toLowerCase().replace(/\s/g,"-"),g=a.body.description,h=new _website.Website(d.getGitlabUserId(),f,g,a.query.id),_async["default"].waterfall([function(b){a.files?(i=a.files.logo,i.mv(logoDir+(i.name+""),function(a){i=logoDir+(i.name+""),b(a,i)})):b(null,i)},/*#__PURE__*/function(){var a=_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function c(a){var d;return _regeneratorRuntime().wrap(function e(c){for(;1;)switch(c.prev=c.next){case 0:return c.next=2,_gitlabController.gitlabController.updateProject(h,a);case 2:d=c.sent,d.status?"has already been taken"===d.data.message.name?b.flash("error","Der Projektname '"+(f+"' ist bereits vergeben, bitte w\xE4hlen Sie einen anderen Namen.")):b.flash("error","Ein Fehler ist aufgetreten. Bitte versuchen Sie es erneut.\xA0"):(h.setLogo(d.avatar_url),h.setPath(d.path),b.flash("success","Ihre Website wurde aktualisiert")),b.redirect("/account/updateInformation?id="+(h.getId()+""));case 5:case"end":return c.stop();}},c)}));return function(b){return a.apply(this,arguments)}}()],function(a){null!=a&&console.log(a),i&&_fs["default"].unlink(i,function(a){null!=a&&console.log(a)})})):(b.flash("error","Bitte geben Sie die ben\xF6tigten Daten ein"),b.redirect("/account/updateInformation"));case 8:case"end":return c.stop();}},c)}));return function(b,c){return a.apply(this,arguments)}}()),a["delete"]("/deleteProject",/*#__PURE__*/function(){var a=_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function c(a,b){var d,f,g,h;return _regeneratorRuntime().wrap(function i(c){for(;1;)switch(c.prev=c.next){case 0:if(a.isAuthenticated()){c.next=4;break}b.redirect("/login"),c.next=33;break;case 4:return c.next=6,e(a.user.email);case 6:if(d=c.sent,null!=d){c.next=11;break}b.redirect("/login"),c.next=33;break;case 11:if(f=a.body.id,!f){c.next=32;break}return c.next=15,_gitlabController.gitlabController.getProjectById(f);case 15:if(g=c.sent,g){c.next=20;break}console.log(" ========= Error or no project found"),c.next=32;break;case 20:if(g.owner){c.next=24;break}console.log(" ========= Project cannot be accessed, since it does not have an owner"),c.next=32;break;case 24:if(g.owner.id===d.getGitlabUserId()){c.next=28;break}console.log(" ========= Access denied: Not your project"),c.next=32;break;case 28:return c.next=30,_gitlabController.gitlabController.deleteProjectById(f);case 30:h=c.sent,h||b.flash("error","Project cannot be deleted. Please try again.");case 32:b.redirect("/account/services");case 33:case"end":return c.stop();}},c)}));return function(b,c){return a.apply(this,arguments)}}())}; \ No newline at end of file diff --git a/built/routes/cert/cert.pem b/built/routes/cert/cert.pem new file mode 100644 index 00000000..0a11f4a1 --- /dev/null +++ b/built/routes/cert/cert.pem @@ -0,0 +1,33 @@ +-----BEGIN CERTIFICATE----- +MIIFpDCCA4ygAwIBAgIJAKOpWVnPZyUUMA0GCSqGSIb3DQEBCwUAMGcxCzAJBgNV +BAYTAkRFMRIwEAYDVQQIDAlTdHV0dGdhcnQxEjAQBgNVBAcMCVN0dXR0Z2FydDEM +MAoGA1UECgwDSEZUMQ4wDAYDVQQLDAVNNExBQjESMBAGA1UEAwwJU2lob21iaW5n +MB4XDTE5MTEwODE0MzI0M1oXDTIyMDQyNjE0MzI0M1owZzELMAkGA1UEBhMCREUx +EjAQBgNVBAgMCVN0dXR0Z2FydDESMBAGA1UEBwwJU3R1dHRnYXJ0MQwwCgYDVQQK +DANIRlQxDjAMBgNVBAsMBU00TEFCMRIwEAYDVQQDDAlTaWhvbWJpbmcwggIiMA0G +CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDmPKgA2gn8KOBe73p3Tsdve90n2itC +wno8qs3XyTatdk84PZWOJz7iyWElLOgKUThvbQ7Z6yDKSFxmuwX+cMqqdmaJY6Dz +vKOPOQT0adGWUlRRP0QucTYKvV8euqr+vKBWo6HN73RYXgwSVapOfNCh71s09cmh +2jkGPvPgQ0ZhoO85fdn4xf328bP0b4pG5oCJu/oOWxesCXlyHcOGx0jrR8H7Nsee +36vOrOg3CJWM+LNWhemKOC0WBj+3zEyVxiHZgy/3XAIBY2vohnU8osaOdVqT9sBr +DrW4zkwAbGQiiDoUVfZw0ERS3YkBPbTtY3dkRviEabRn7WGCCsGRXNRIAm9pRl7W +osddMIu4tmkmNeJvfBFv3fM/aVS6UYuSmUAdd5g5M82U9BFz5IRXZITODbgLO6jM +dZ5XM3sffadrneC0r/IKnX57XvC6jUvSuAtum6Zct2sr5tEJRrrkZ52ZVLydBQtW +kvcqD/C+t4sJpLXn+2Dt+FRc5NTy/zu5kNJ4FKBx+aBMdWVk336y40yjlAFcWu82 +dKL0RzTlPGdp7IGsrCRsPozVrawtM/5OPcAMow/Tg8q9Z67wbpeB3OGiG1PmpjNq +iG/+l/CrU8PSBF+RaSRNg+VfPTw+0lAatV0RstHJzXN4a+fQVGt54rN+mkNE7LrV +TTgWPqAk9AcPuQIDAQABo1MwUTAdBgNVHQ4EFgQUQXEm5SdEh/kQ5cjAhQxgVkL/ +GQowHwYDVR0jBBgwFoAUQXEm5SdEh/kQ5cjAhQxgVkL/GQowDwYDVR0TAQH/BAUw +AwEB/zANBgkqhkiG9w0BAQsFAAOCAgEA1yuHFmrzoVMLC0f+puPT7ob9Efhyk17G +mYHu5IWGzovDjkFv2w0ZzI86XhIBjpyVHgivVQjCFmnnb6FdFHCVJD3eNKHJTRD+ +TBi42mU9AOm+lcK39jL4+Nhnr5rmob+UsOgqhUxx76Y0BSIUm7ax3ezHp7mmbr68 +hxQcPv1YEmrSE0NQvXl1ck5CeK/p8KOsGKGaOnnfvMp7QICTLeCiRnBSCTk0pWgY +KP3DSAsp4OtuaHXh7xnNKOMrK2mvZJux3U2z6BC2JGWZGnBGjmwHr7xA7P2gg642 +IsSvcYBR9QHoQHJZT8x2904igVIxHUjz4H3oAgL4e8ksTANKkudmtAD/YDW1rLTY +mpWUyMf5UwVXzd8/VoAkzX7gNh7oTXPmo0gQ1XyWQRKokoUGdkz38bb3J8yOlpwN +1XojKDyucM/CWB3zUmoXgjQwKlf+oF5AyYv5ElIHoZK3S6WciKjYjJqfZA7RqPml +LVBbDZNcDZm/e5qtYz7r4TOW75GNJLzXnafGwqeNmbHprgYdvjlNLmtAeojuKr8n +Pi3Lu89e/8IKbX6+GkuYcv6XjnQc+keTBb4Lo17+HXduixgMyEy+ErIOUx6UMiLs +8UgrEsOaxhrzEufC5B6tqYGQzMXTBuSW/Mzv6BddX4W3+pnOa9m7B3+JMFlh0lgC +GobuGUHz6X4= +-----END CERTIFICATE----- diff --git a/built/routes/cert/cert_idp.pem b/built/routes/cert/cert_idp.pem new file mode 100644 index 00000000..a113711b --- /dev/null +++ b/built/routes/cert/cert_idp.pem @@ -0,0 +1 @@ +key-goes-here \ No newline at end of file diff --git a/built/routes/cert/key.pem b/built/routes/cert/key.pem new file mode 100644 index 00000000..735408af --- /dev/null +++ b/built/routes/cert/key.pem @@ -0,0 +1,3 @@ +-----BEGIN PRIVATE KEY----- +key-goes-here +-----END PRIVATE KEY----- diff --git a/built/routes/public.js b/built/routes/public.js new file mode 100644 index 00000000..5a1bfaa4 --- /dev/null +++ b/built/routes/public.js @@ -0,0 +1,7 @@ +"use strict";var _publicController=require("../controller/publicController");function _typeof(a){"@babel/helpers - typeof";return _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(a){return typeof a}:function(a){return a&&"function"==typeof Symbol&&a.constructor===Symbol&&a!==Symbol.prototype?"symbol":typeof a},_typeof(a)}function _regeneratorRuntime(){"use strict";/*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */function a(a,b,c){return Object.defineProperty(a,b,{value:c,enumerable:!0,configurable:!0,writable:!0}),a[b]}function b(a,b,e,f){var g=b&&b.prototype instanceof d?b:d,h=Object.create(g.prototype),j=new l(f||[]);return h._invoke=function(a,b,d){var e="suspendedStart";return function(f,g){if("executing"===e)throw new Error("Generator is already running");if("completed"===e){if("throw"===f)throw g;return n()}for(d.method=f,d.arg=g;;){var h=d.delegate;if(h){var j=i(h,d);if(j){if(j===v)continue;return j}}if("next"===d.method)d.sent=d._sent=d.arg;else if("throw"===d.method){if("suspendedStart"===e)throw e="completed",d.arg;d.dispatchException(d.arg)}else"return"===d.method&&d.abrupt("return",d.arg);e="executing";var k=c(a,b,d);if("normal"===k.type){if(e=d.done?"completed":"suspendedYield",k.arg===v)continue;return{value:k.arg,done:d.done}}"throw"===k.type&&(e="completed",d.method="throw",d.arg=k.arg)}}}(a,e,j),h}function c(a,b,c){try{return{type:"normal",arg:a.call(b,c)}}catch(a){return{type:"throw",arg:a}}}function d(){}function e(){}function f(){}function g(b){["next","throw","return"].forEach(function(c){a(b,c,function(a){return this._invoke(c,a)})})}function h(a,b){function d(e,f,g,h){var i=c(a[e],a,f);if("throw"!==i.type){var j=i.arg,k=j.value;return k&&"object"==_typeof(k)&&q.call(k,"__await")?b.resolve(k.__await).then(function(a){d("next",a,g,h)},function(a){d("throw",a,g,h)}):b.resolve(k).then(function(a){j.value=a,g(j)},function(a){return d("throw",a,g,h)})}h(i.arg)}var e;this._invoke=function(a,c){function f(){return new b(function(b,e){d(a,c,b,e)})}return e=e?e.then(f,f):f()}}function i(a,b){var d=a.iterator[b.method];if(void 0===d){if(b.delegate=null,"throw"===b.method){if(a.iterator["return"]&&(b.method="return",b.arg=void 0,i(a,b),"throw"===b.method))return v;b.method="throw",b.arg=new TypeError("The iterator does not provide a 'throw' method")}return v}var e=c(d,a.iterator,b.arg);if("throw"===e.type)return b.method="throw",b.arg=e.arg,b.delegate=null,v;var f=e.arg;return f?f.done?(b[a.resultName]=f.value,b.next=a.nextLoc,"return"!==b.method&&(b.method="next",b.arg=void 0),b.delegate=null,v):f:(b.method="throw",b.arg=new TypeError("iterator result is not an object"),b.delegate=null,v)}function j(a){var b={tryLoc:a[0]};1 in a&&(b.catchLoc=a[1]),2 in a&&(b.finallyLoc=a[2],b.afterLoc=a[3]),this.tryEntries.push(b)}function k(a){var b=a.completion||{};b.type="normal",delete b.arg,a.completion=b}function l(a){this.tryEntries=[{tryLoc:"root"}],a.forEach(j,this),this.reset(!0)}function m(a){if(a){var b=a[s];if(b)return b.call(a);if("function"==typeof a.next)return a;if(!isNaN(a.length)){var c=-1,d=function b(){for(;++c<a.length;)if(q.call(a,c))return b.value=a[c],b.done=!1,b;return b.value=void 0,b.done=!0,b};return d.next=d}}return{next:n}}function n(){return{value:void 0,done:!0}}_regeneratorRuntime=function(){return o};var o={},p=Object.prototype,q=p.hasOwnProperty,r="function"==typeof Symbol?Symbol:{},s=r.iterator||"@@iterator",t=r.asyncIterator||"@@asyncIterator",u=r.toStringTag||"@@toStringTag";try{a({},"")}catch(b){a=function(a,b,c){return a[b]=c}}o.wrap=b;var v={},w={};a(w,s,function(){return this});var x=Object.getPrototypeOf,y=x&&x(x(m([])));y&&y!==p&&q.call(y,s)&&(w=y);var z=f.prototype=d.prototype=Object.create(w);return e.prototype=f,a(z,"constructor",f),a(f,"constructor",e),e.displayName=a(f,u,"GeneratorFunction"),o.isGeneratorFunction=function(a){var b="function"==typeof a&&a.constructor;return!!b&&(b===e||"GeneratorFunction"===(b.displayName||b.name))},o.mark=function(b){return Object.setPrototypeOf?Object.setPrototypeOf(b,f):(b.__proto__=f,a(b,u,"GeneratorFunction")),b.prototype=Object.create(z),b},o.awrap=function(a){return{__await:a}},g(h.prototype),a(h.prototype,t,function(){return this}),o.AsyncIterator=h,o.async=function(a,c,d,e,f){void 0===f&&(f=Promise);var g=new h(b(a,c,d,e),f);return o.isGeneratorFunction(c)?g:g.next().then(function(a){return a.done?a.value:g.next()})},g(z),a(z,u,"Generator"),a(z,s,function(){return this}),a(z,"toString",function(){return"[object Generator]"}),o.keys=function(a){var b=[];for(var c in a)b.push(c);return b.reverse(),function c(){for(;b.length;){var d=b.pop();if(d in a)return c.value=d,c.done=!1,c}return c.done=!0,c}},o.values=m,l.prototype={constructor:l,reset:function reset(a){if(this.prev=0,this.next=0,this.sent=this._sent=void 0,this.done=!1,this.delegate=null,this.method="next",this.arg=void 0,this.tryEntries.forEach(k),!a)for(var b in this)"t"===b.charAt(0)&&q.call(this,b)&&!isNaN(+b.slice(1))&&(this[b]=void 0)},stop:function stop(){this.done=!0;var a=this.tryEntries[0].completion;if("throw"===a.type)throw a.arg;return this.rval},dispatchException:function dispatchException(a){function b(b,d){return f.type="throw",f.arg=a,c.next=b,d&&(c.method="next",c.arg=void 0),!!d}if(this.done)throw a;for(var c=this,d=this.tryEntries.length-1;0<=d;--d){var e=this.tryEntries[d],f=e.completion;if("root"===e.tryLoc)return b("end");if(e.tryLoc<=this.prev){var g=q.call(e,"catchLoc"),h=q.call(e,"finallyLoc");if(g&&h){if(this.prev<e.catchLoc)return b(e.catchLoc,!0);if(this.prev<e.finallyLoc)return b(e.finallyLoc)}else if(!g){if(!h)throw new Error("try statement without catch or finally");if(this.prev<e.finallyLoc)return b(e.finallyLoc)}else if(this.prev<e.catchLoc)return b(e.catchLoc,!0)}}},abrupt:function abrupt(a,b){for(var c,d=this.tryEntries.length-1;0<=d;--d)if(c=this.tryEntries[d],c.tryLoc<=this.prev&&q.call(c,"finallyLoc")&&this.prev<c.finallyLoc){var e=c;break}e&&("break"===a||"continue"===a)&&e.tryLoc<=b&&b<=e.finallyLoc&&(e=null);var f=e?e.completion:{};return f.type=a,f.arg=b,e?(this.method="next",this.next=e.finallyLoc,v):this.complete(f)},complete:function complete(a,b){if("throw"===a.type)throw a.arg;return"break"===a.type||"continue"===a.type?this.next=a.arg:"return"===a.type?(this.rval=this.arg=a.arg,this.method="return",this.next="end"):"normal"===a.type&&b&&(this.next=b),v},finish:function finish(a){for(var b,c=this.tryEntries.length-1;0<=c;--c)if(b=this.tryEntries[c],b.finallyLoc===a)return this.complete(b.completion,b.afterLoc),k(b),v},catch:function _catch(a){for(var b,c=this.tryEntries.length-1;0<=c;--c)if(b=this.tryEntries[c],b.tryLoc===a){var d=b.completion;if("throw"===d.type){var e=d.arg;k(b)}return e}throw new Error("illegal catch attempt")},delegateYield:function delegateYield(a,b,c){return this.delegate={iterator:m(a),resultName:b,nextLoc:c},"next"===this.method&&(this.arg=void 0),v}},o}function asyncGeneratorStep(a,b,c,d,e,f,g){try{var h=a[f](g),i=h.value}catch(a){return void c(a)}h.done?b(i):Promise.resolve(i).then(d,e)}function _asyncToGenerator(a){return function(){var b=this,c=arguments;return new Promise(function(d,e){function f(a){asyncGeneratorStep(h,d,e,f,g,"next",a)}function g(a){asyncGeneratorStep(h,d,e,f,g,"throw",a)}var h=a.apply(b,c);f(void 0)})}}module.exports=function(a,b,c){// ================== NEW USERS REGISTRATION ====================== +// to check whether or not an account is already exist +// =================== USERS VERIFICATION ========================= +// ==================== FORGOT PASSWORD =========================== +// reset +// ======================= CONTACT FORM =========================== +a.get("/registration",function(a,b){_publicController.publicController.showRegistrationPage(b,c)}),a.post("/registration",function(a,c){_publicController.publicController.registerUser(a,c,b)}),a.get("/email/:email",/*#__PURE__*/function(){var a=_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function c(a,b){return _regeneratorRuntime().wrap(function d(c){for(;1;)switch(c.prev=c.next){case 0:_publicController.publicController.checkUserEmail(a,b);case 1:case"end":return c.stop();}},c)}));return function(b,c){return a.apply(this,arguments)}}()),a.get("/verifyAccount",/*#__PURE__*/function(){var a=_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function d(a,b){return _regeneratorRuntime().wrap(function e(d){for(;1;)switch(d.prev=d.next){case 0:_publicController.publicController.verifyAccount(a,b,c);case 1:case"end":return d.stop();}},d)}));return function(b,c){return a.apply(this,arguments)}}()),a.get("/forgotPwd",function(a,b){_publicController.publicController.showForgotPwdPage(a,b,c)}),a.post("/forgotPwd",function(a,c){_publicController.publicController.generateNewToken(a,c,b)}),a.get("/reset/:token",/*#__PURE__*/function(){var a=_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function d(a,b){return _regeneratorRuntime().wrap(function e(d){for(;1;)switch(d.prev=d.next){case 0:_publicController.publicController.showResetPassword(a,b,c);case 1:case"end":return d.stop();}},d)}));return function(b,c){return a.apply(this,arguments)}}()),a.post("/reset/:token",/*#__PURE__*/function(){var a=_asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function c(a,b){return _regeneratorRuntime().wrap(function d(c){for(;1;)switch(c.prev=c.next){case 0:_publicController.publicController.resetPassword(a,b);case 1:case"end":return c.stop();}},c)}));return function(b,c){return a.apply(this,arguments)}}()),a.get("/contact",function(a,b){_publicController.publicController.showContactPage(a,b,c)}),a.post("/contact",function(a,b){_publicController.publicController.sendContactMessage(a,b)})}; \ No newline at end of file diff --git a/built/views/DE/404.pug b/built/views/DE/404.pug new file mode 100644 index 00000000..29a3cd86 --- /dev/null +++ b/built/views/DE/404.pug @@ -0,0 +1,30 @@ +doctype html +html(lang="de") + head + title= "404 - Page not found" + meta(charset="UTF-8") + meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no") + link(rel="stylesheet", type="text/css", href="/css/bootstrap.min.css") + style. + .container { + height: 400px; + position: relative; + } + .center { + margin: 0; + position: absolute; + top: 50%; + left: 50%; + -ms-transform: translate(-50%, -50%); + transform: translate(-50%, -50%); + } + body + div(class="container") + div(class="center", align="center") + a(href="/") + img(src="/images/demo/m4lab_logo.jpg", class="img-responsive center-block", width="185", height="192") + br + br + p(class="h5") 404. The requested URL was not found. + // Bootstrap + script(src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous") \ No newline at end of file diff --git a/built/views/DE/500.pug b/built/views/DE/500.pug new file mode 100644 index 00000000..20dbfa9d --- /dev/null +++ b/built/views/DE/500.pug @@ -0,0 +1,31 @@ +doctype html +html(lang="de") + head + title= "500 - Internal Server Error" + meta(charset="UTF-8") + meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no") + link(rel="stylesheet", type="text/css", href="/css/bootstrap.min.css") + style. + .container { + height: 400px; + position: relative; + } + .center { + margin: 0; + position: absolute; + top: 50%; + left: 50%; + -ms-transform: translate(-50%, -50%); + transform: translate(-50%, -50%); + } + body + div(class="container") + div(class="center", align="center") + a(href="/") + img(src="/images/demo/m4lab_logo.jpg", class="img-responsive center-block", width="185", height="192") + br + br + p(class="h5") 500. Unexpected Error :( + p #{ error } + // Bootstrap + script(src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous") \ No newline at end of file diff --git a/built/views/DE/account/contact.pug b/built/views/DE/account/contact.pug new file mode 100644 index 00000000..d25a801d --- /dev/null +++ b/built/views/DE/account/contact.pug @@ -0,0 +1,56 @@ +doctype html +html(lang="de") + head + title= "Kontakt" + meta(charset="UTF-8") + meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no") + link(rel="stylesheet", type="text/css", href="/css/bootstrap.min.css") + link(rel="stylesheet", type="text/css", href="/css/m4lab.css") + link(rel="stylesheet", type="text/css", href="/css/m4lab-mobile.css") + link(rel="stylesheet", type="text/css", href="/css/Contact-Form-Clean.css") + link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous") + body + div(class="container") + div(class="row") + div(class="col-md-12 margin_bottom_40") + img(class="mx-auto" src="/img/Kontakt.jpg" width="100%") + div(class="contact-clean background_eaeaea") + if flash.success + div.alert.alert-success.alert-dismissible #{flash.success} + a(class="close", href="#", data-dismiss="alert", aria-label="close") × + if flash.error + div.alert.alert-danger.alert-dismissible.fade.show #{flash.error} + a(class="close", href="#", data-dismiss="alert", aria-label="close") × + form(method="POST") + h2(class="text_center") Kontaktieren Sie uns + div(class="form-group") + input#name(class="form-control" type="text" name="name" placeholder="Name") + div(class="form-group") + input#inputEmail(name="inputEmail", type="email", class="form-control", placeholder="E-Mail-Adresse*", maxlength="45" required) + div(class="form-group") + textarea#message(class="form-control" name="message" placeholder="Nachricht" rows="14") + div(class="form-group") + input#submitBtn(class="btn btn-primary" type="submit" value="SENDEN") + div(class="contact-clean contact_footer") + form + p(class="m_top_25") <strong>Hochschule für Technik Stuttgart</strong><br/>Institut für Angewandte Forschung<br/>Innovative Hochschule - Projekt M4_LAB<br/>Schellingstr. 24<br/>70174 Stuttgart<br/>Deutschland<br/><br/><a href="mailto:support-transfer@hft-stuttgart.de">support-transfer@hft-stuttgart.de</a><br/><br/><a href="https://www.hft-stuttgart.de/">www.hft-stuttgart.de</a> / <a href="https://www.hft-stuttgart.de/M4LAB">www.hft-stuttgart.de/M4LAB</a><br/> + div(class="background_8a348b") + div(class="container") + div(class="row") + div(class="col-md-4 col-lg-2") + div(class="col-md-4 col-lg-8") + div(class="contact_foot_message") + img(class="d-flex d-lg-flex justify-content-center justify-content-lg-center align-items-lg-start mx-auto p_bottom_35" src="/img/Logo_TV1.png" width="100px") + h2(class="text-center color_8a348b") <strong>Transferportal</strong> + p(class="text-center") Das Transferportal entsteht in einem Teilprojekt der Innovativen <a href="https://www.hft-stuttgart.de">Hochschule für Technik Stuttgart</a>. Im <a href="https://www.hft-stuttgart.de/forschung/innovative-hochschule-m4-lab">Innovationslabor M4_LAB</a> wird das Transferportal als eine Webpräsenz entwickelt, welches Wissen, Lösungen und Dienste für HFT-Mitglieder, externe Partner und die allgemeine Öffentlichkeit bereitstellt.<br/><br/>Es ergänzt die Informationen der allgemeinen HFT-Webseite durch konkrete Ergebnisse aus Forschung und Entwicklung, verfügbar in verschiedenster Form wie beispielsweise Daten, Dokumentationen und Software-Code.<br/><br/>Zudem stellt es Kollaborationsmittel für Projektpartner und später auch Partizipationsmöglichkeiten für die breite Öffentlichkeit bereit. + div(class="col-md-4 col-lg-2") + + + // jQuery + 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") + // Bootstrap + script(src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous") + // M4_LAB + script(src="/js/headfoot.js") + script(src="/js/mobile.js") diff --git a/built/views/DE/account/forgotPwd.pug b/built/views/DE/account/forgotPwd.pug new file mode 100644 index 00000000..4827e727 --- /dev/null +++ b/built/views/DE/account/forgotPwd.pug @@ -0,0 +1,36 @@ +doctype html +html(lang="de") + head + title= "Forgot Password" + meta(charset="UTF-8") + meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no") + link(rel="stylesheet", type="text/css", href="/css/bootstrap.min.css") + link(rel="stylesheet", type="text/css", href="/css/m4lab.css") + link(rel="stylesheet", type="text/css", href="/css/m4lab-mobile.css") + link(rel="stylesheet", type="text/css", href="/css/custom/login.css") + link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous") + body + div(class="container-fluid") + div(class="row") + div(class="col-md-6 offset-md-3") + if flash.success + div.alert.alert-success.alert-dismissible #{flash.success} + a(class="close", href="#", data-dismiss="alert", aria-label="close") × + if flash.error + div.alert.alert-danger.alert-dismissible.fade.show #{flash.error} + a(class="close", href="#", data-dismiss="alert", aria-label="close") × + form#forgotForm(class="form-signin", method="POST") + img(src="https://transfer.hft-stuttgart.de/img/M4_LAB_LOGO.png", class="img-responsive center-block", width="185", height="192") + div(class="form-row") + input#inputEmail(name="inputEmail", type="email", class="form-control", placeholder="E-Mail-Adresse" required) + br + input(type="submit", class="btn btn-outline-dark btn-block", value="Passwort zurücksetzen") + + // jQuery + 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") + // Bootstrap + script(src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous") + // M4_LAB + script(src="/js/headfoot.js") + script(src="/js/mobile.js") diff --git a/built/views/DE/account/home.pug b/built/views/DE/account/home.pug new file mode 100644 index 00000000..ff4409e9 --- /dev/null +++ b/built/views/DE/account/home.pug @@ -0,0 +1,75 @@ +doctype html +html(lang="de") + head + title= "User Account" + meta(charset="UTF-8") + meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no") + link(rel="stylesheet", type="text/css", href="/css/bootstrap.min.css") + link(rel="stylesheet", type="text/css", href="/css/m4lab.css") + link(rel="stylesheet", type="text/css", href="/css/m4lab-mobile.css") + link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous") + body + div(class="container") + if user.verificationStatus == 0 + div.alert.alert-warning.alert-dismissible + | Willkommen im Benutzerkonto-Bereich des HFT Transferportals + | <br/><br/> + | Wir haben Ihnen eine E-Mail an Ihre verwendete Adresse gesendet. Diese enthält einen Link zur Bestätigung Ihres Accounts. + | Wenn Sie die Mail nicht in ihrem Postfach vorfinden, prüfen Sie bitte auch Ihren Spam-Ordner. + | <br >Falls Sie keine E-Mail von uns erhalten haben, können Sie <a href="javascript:void(0);" onclick="verify();">diese hier</a> erneut anfordern. + div(class="spinner-border text-secondary display_none", role="status") + else + div(class="row min-vh-100 flex-column flex-md-row") + aside(class="col-12 col-md-3 p-0 flex-shrink-1") + nav(class="navbar navbar-expand flex-md-column flex-row align-items-start py-2") + div(class="collapse navbar-collapse") + ul(class="flex-md-column flex-row navbar-nav w-100 justify-content-between") + li(class="nav-item") + a(class="nav-link pl-0 text-nowrap" href="#") + span(class="font-weight-bold color_black") #{user.firstName} #{user.lastName} + li(class="nav-item") + a(class="nav-link pl-0" href="/account/profile") + i(class="fa fa-user fa-fw") + span(class="d-none d-md-inline") Benutzerprofil + if user.is_m4lab_idp + li(class="nav-item") + a(class="nav-link pl-0" href="/account/security") + i(class="fa fa-lock fa-fw") + span(class="d-none d-md-inline") Sicherheitseinstellungen + li(class="nav-item") + a(class="nav-link pl-0" href="/account/services") + i(class="fa fa-tasks fa-fw") + span(class="d-none d-md-inline") Projekte und Dienste + li(class="nav-item") + a(class="nav-link pl-0 color_red" href="/logout") + i(class="fa fa-sign-out-alt fa-fw") + span(class="d-none d-md-inline") Logout + main(class="col bg-faded py-3 flex-grow-1") + p Willkommen im Benutzerkonto-Bereich des HFT Transferportals + p In diesem Bereich können Sie Ihr Benutzerkonto pflegen.<br/> Dazu finden Sie auf der linken Seite verschiedene Menüs. + p Bei Rückfragen kontaktieren Sie uns bitte unter: <a href="mailto:support-transfer@hft-stuttgart.de">support-transfer@hft-stuttgart.de</a> + + // jQuery + 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") + // Bootstrap + script(src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous") + // M4_LAB + script(src="/js/headfoot.js") + script(src="/js/mobile.js") + script. + // call verifyAccount + function verify() { + $(".spinner-border").show() + $.get( "/resendVerificationEmail", function( data ) { + if (data) { alert( "Email sent!" ) } + else { alert("Please contact support-transfer@hft-stuttgart.de to verify your account.") } + }) + .fail(function() { + alert( "Something went wrong. Please try again." ) // todo: to DE + }) + .always(function() { + $(".spinner-border").hide() + }) + + } \ No newline at end of file diff --git a/built/views/DE/account/newInformation.pug b/built/views/DE/account/newInformation.pug new file mode 100644 index 00000000..4d82fe0d --- /dev/null +++ b/built/views/DE/account/newInformation.pug @@ -0,0 +1,123 @@ +doctype html +html(lang="de") + head + title= "Setup a new website" + meta(charset="UTF-8") + meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no") + link(rel="stylesheet", type="text/css", href="/css/bootstrap.min.css") + link(rel="stylesheet", type="text/css", href="/css/m4lab.css") + link(rel="stylesheet", type="text/css", href="/css/m4lab-mobile.css") + link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous") + body + div(class="container") + div(class="row min-vh-100 flex-column flex-md-row") + aside(class="col-12 col-md-3 p-0 flex-shrink-1") + nav(class="navbar navbar-expand flex-md-column flex-row align-items-start py-2") + div(class="collapse navbar-collapse") + ul(class="flex-md-column flex-row navbar-nav w-100 justify-content-between") + li(class="nav-item") + a(class="nav-link pl-0 text-nowrap" href="/account/") + span(class="font-weight-bold" style="color:black;") #{user.firstName} #{user.lastName} + li(class="nav-item") + a(class="nav-link pl-0" href="/account/profile") + i(class="fa fa-user fa-fw") + span(class="d-none d-md-inline") Benutzerprofil + if user.is_m4lab_idp + li(class="nav-item") + a(class="nav-link pl-0" href="/account/security") + i(class="fa fa-lock fa-fw") + span(class="d-none d-md-inline") Sicherheitseinstellungen + li(class="nav-item") + a(class="nav-link pl-0" href="/account/services") + i(class="fa fa-tasks fa-fw" style="color:black;") + span(class="d-none d-md-inline" style="color:black;") Projekte und Dienste + li(class="nav-item") + a(class="nav-link pl-0" href="/logout" style="color:red;") + i(class="fa fa-sign-out-alt fa-fw") + span(class="d-none d-md-inline") Logout + main(class="col bg-faded py-3 flex-grow-1") + nav(aria-label="breadcrumb") + ol(class="breadcrumb") + li(class="breadcrumb-item") + a(href="/account/") Konto + li(class="breadcrumb-item") + a(href="/account/services") Projekte und Dienste + li(class="breadcrumb-item active" aria-current="page") Neue Projektinformation + + if flash.success + div.alert.alert-success.alert-dismissible #{flash.success} + a(class="close", href="#", data-dismiss="alert", aria-label="close") × + if flash.error + div.alert.alert-danger.alert-dismissible.fade.show #{flash.error} + a(class="close", href="#", data-dismiss="alert", aria-label="close") × + + h3(class="pb-2") Neue Projektinformation + div(class="mx-4") + h4(class="pb-1") Schritt 1: Setup + p Bitte füllen Sie alle Felder aus + form(method="POST", encType="multipart/form-data") + div(class='form-group row') + label(for="template", class="col-sm-2") Template + div(class="col-sm-8") + select#templateSelector(name="template", class="form-control") + option(value="generic") generic + option(value="simple_raw") simple_raw + option(value="simple_thesis") simple_thesis + | <span id="templateExample" class="font-italic font-weight-light"><small>See the demo: <a href="https://transfer.hft-stuttgart.de/pages/athanasios.koukofikis/mygeneric/home/" target="_blank">generic</a>, <a href="https://transfer.hft-stuttgart.de/pages/athanasios.koukofikis/myraw/home/" target="_blank">simple_raw</a>, <a href="https://transfer.hft-stuttgart.de/pages/athanasios.koukofikis/mythesis/home/" target="_blank">simple_thesis</a></small></span> + div(class='form-group row') + label(for="name", class="col-sm-2") Name + div(class="col-sm-8") + input#name(name="name", type="text", class="form-control", placeholder="Name", maxlength="75" required) + p(id="nameInfo" class="font-italic font-weight-light") <small>Ihre Webseite wird unter folgender URL veröffentlicht: <strong>https://transfer.hft-stuttgart.de/pages/#{gitlabUsername}/<span id="websiteName"></span></strong></small> + div(class="form-group row") + label(for="description", class="col-sm-2") Beschreibung + div(class="col-sm-8") + textarea#description(name="description", type="text", class="form-control", placeholder="Beschreibung", maxlength="500" required) + div(class="form-group row") + label(for="logo", class="col-sm-2") Projektlogo + div(class="col-sm-8") + div(class="form-group row px-4") + - let defaultLogo = "/img/footer/M4_LAB_LOGO_Graustufen.png" + img(src=defaultLogo, width="100" height="100") + div(class="form-group row px-3") + input#logo(name="logo", class="form-control-file", type="file") + p <small>(Max file size is 80 KB.)</small> + input(type="submit", class="btn btn-primary", value="Senden") + hr + div(class="mx-4", style="color: gray;") + h4(class="pb-1") Schritt 2: Dateneingabe + p Bitte stellen Sie sicher in GitLab, dass sie Folgendes abgeschlossen haben, bevor Sie Ihre Webseite veröffentlichen: + ol + li Bearbeiten Sie ihre <i>index.html</i> + li Anpassen der Einstellungen in <i>settings.js</i> + + // jQuery + 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") + // jquery-loading-overlay + script(src="https://cdn.jsdelivr.net/npm/gasparesganga-jquery-loading-overlay@2.1.7/dist/loadingoverlay.min.js") + // Bootstrap + script(src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous") + // M4_LAB + script(src="/js/headfoot.js") + script(src="/js/mobile.js") + script. + // website URL + function showWebsiteURL() { + if ($("#name").val()) { + $("#nameInfo").show() + let webName = $("#name").val().toLowerCase().replace(/\s/g, '-') + document.getElementById("websiteName").innerText = webName+"/home/" + } + else { + $("#nameInfo").hide() + } + } + $('#name').on('input',function(e){ + showWebsiteURL() + }) + showWebsiteURL() + + $("form").submit(function(){ + $.LoadingOverlay("show") + }); \ No newline at end of file diff --git a/built/views/DE/account/profile.pug b/built/views/DE/account/profile.pug new file mode 100644 index 00000000..42ee4f9f --- /dev/null +++ b/built/views/DE/account/profile.pug @@ -0,0 +1,112 @@ +doctype html +html(lang="de") + head + title= "Benutzerprofil" + meta(charset="UTF-8") + meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no") + link(rel="stylesheet", type="text/css", href="/css/bootstrap.min.css") + link(rel="stylesheet", type="text/css", href="/css/m4lab.css") + link(rel="stylesheet", type="text/css", href="/css/m4lab-mobile.css") + link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous") + body + div(class="container") + div(class="row min-vh-100 flex-column flex-md-row") + aside(class="col-12 col-md-3 p-0 flex-shrink-1") + nav(class="navbar navbar-expand flex-md-column flex-row align-items-start py-2") + div(class="collapse navbar-collapse") + ul(class="flex-md-column flex-row navbar-nav w-100 justify-content-between") + li(class="nav-item") + a(class="nav-link pl-0 text-nowrap" href="/account/") + span(class="font-weight-bold color_black") #{user.firstName} #{user.lastName} + li(class="nav-item") + a(class="nav-link pl-0" href="#") + i(class="fa fa-user fa-fw color_black") + span(class="d-none d-md-inline color_black") Benutzerprofil + if user.is_m4lab_idp + li(class="nav-item") + a(class="nav-link pl-0" href="/account/security") + i(class="fa fa-lock fa-fw") + span(class="d-none d-md-inline") Sicherheitseinstellungen + li(class="nav-item") + a(class="nav-link pl-0" href="/account/services") + i(class="fa fa-tasks fa-fw") + span(class="d-none d-md-inline") Projekte und Dienste + li(class="nav-item") + a(class="nav-link pl-0 color_red" href="/logout") + i(class="fa fa-sign-out-alt fa-fw") + span(class="d-none d-md-inline") Logout + main(class="col bg-faded py-3 flex-grow-1") + nav(aria-label="breadcrumb") + ol(class="breadcrumb") + li(class="breadcrumb-item") + a(href="/account/") Konto + li(class="breadcrumb-item active" aria-current="page") Benutzerprofil + + if flash.success + div.alert.alert-success.alert-dismissible #{flash.success} + a(class="close", href="#", data-dismiss="alert", aria-label="close") × + if flash.error + div.alert.alert-danger.alert-dismissible.fade.show #{flash.error} + a(class="close", href="#", data-dismiss="alert", aria-label="close") × + + h3(class="pb-2") Mein Profil + form#profileForm(method="POST", action="/account/updateProfile") + div(class="form-row") + div(class='form-group col-md-2') + label(for="title") Anrede + select#inputSalutation(name="inputSalutation", class="form-control", value=user.salutation) + option(value="") - Anrede - + option(value="Herr") Herr + option(value="Frau") Frau + option(value="Divers") Divers + script. + var salutationOptions = document.getElementById('inputSalutation').options; + for (i=0; i < salutationOptions.length; i++) { + if (salutationOptions[i].value == '#{user.salutation}') + salutationOptions[i].selected = true; + } + div(class='form-group col-md-2') + label(for="title") Titel + select#inputTitle(name="inputTitle", class="form-control", value=user.title) + option(value="") - Titel - + option(value="Prof.") Prof. + option(value="Dr.") Dr. + option(value="Dipl.-Ing.") Dipl.-Ing. + script. + var titleOptions = document.getElementById('inputTitle').options; + for (i=0; i < titleOptions.length; i++) { + if (titleOptions[i].value == '#{user.title}') + titleOptions[i].selected = true; + } + div(class='form-group col-md-2') + label(for="firstname") Vorname + input#inputFirstname(name="inputFirstname", type="text", class="form-control", placeholder="Vorname", value=user.firstName, maxlength="45" required) + div(class='form-group col-md-2') + label(for="lastname") Nachname + input#inputLastname(name="inputLastname", type="text", class="form-control", placeholder="Nachname", value=user.lastName, maxlength="45" required) + div(class="form-row") + div(class='form-group col-md-8') + label(for="email") E-mail Adresse + input#inputEmail(name="inputEmail", type="email", class="form-control", placeholder="Email", value=user.email, maxlength="45" required) + div(class="form-row") + div(class='form-group col-md-8') + label(for="organisation") Unternehmen + input#inputOrganisation(name="inputOrganisation", type="text", class="form-control", placeholder="Unternehmen", value=user.organisation, maxlength="45") + div(class="form-row") + div(class='form-group col-md-8') + label(for="industry") Branche + input#inputIndustry(name="inputIndustry", type="text", class="form-control", placeholder="Branche", value=user.industry, maxlength="45") + div(class="form-row") + div(class='form-group col-md-8') + label(for="speciality") Fachgebiete + input#inputSpeciality(name="inputSpeciality", type="text", class="form-control", placeholder="Fachgebiete", value=user.speciality, maxlength="100") + input(type="submit", class="btn btn-primary", value="Speichern") + + // jQuery + 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") + // Bootstrap + script(src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous") + // M4_LAB + script(src="/js/headfoot.js") + script(src="/js/mobile.js") diff --git a/built/views/DE/account/registration.pug b/built/views/DE/account/registration.pug new file mode 100644 index 00000000..df4a3905 --- /dev/null +++ b/built/views/DE/account/registration.pug @@ -0,0 +1,85 @@ +doctype html +html(lang="de") + head + title= "Create New Account" + meta(charset="UTF-8") + meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no") + link(rel="stylesheet", type="text/css", href="/css/bootstrap.min.css") + link(rel="stylesheet", type="text/css", href="/css/m4lab.css") + link(rel="stylesheet", type="text/css", href="/css/m4lab-mobile.css") + link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous") + style. + .warning { + color: red; + font-size: 11px; + } + body + div(class="container-fluid") + div(class="row") + div(class="pt-4 pb-4 col-md-6 offset-md-2") + h3(class="mb-3 font-weight-bold") Neues Benutzerkonto anlegen + div(class="col-md-6 offset-md-3") + div(class="alert alert-info" role="alert") + | Auf dieser Seite können sich Benutzer, die keinen Account an der HFT haben, registrieren.<br/> + | Um sich mit ihrem HFT-Account anzumelden, klicken Sie <a class="font-weight-bold" href="https://transfer.hft-stuttgart.de/account/">hier</a>. + if flash.success + div.alert.alert-success.alert-dismissible #{flash.success} + a(class="close", href="#", data-dismiss="alert", aria-label="close") × + if flash.error + div.alert.alert-danger.alert-dismissible.fade.show #{flash.error} + a(class="close", href="#", data-dismiss="alert", aria-label="close") × + form(method="POST") + h5(class="pt-2 mb-3 font-weight-bold") Anmeldedaten + div(class='form-row') + div(class='form-group col-md-6') + input#inputEmail(name="inputEmail", type="email", class="form-control", placeholder="E-Mail-Adresse*", maxlength="45" required) + span#emailWarning(class='warning') + div(class="form-group col-md-6") + input#inputPassword(name="inputPassword", type="password", class="form-control", data-toggle="password", placeholder="Passwort*", maxlength="45" required) + span#passwordWarning(class='warning') + h5(class="pt-2 mb-3 font-weight-bold") Benutzerprofil + div(class="form-row") + div(class='form-group col-md-2') + select#inputSalutation(name="inputSalutation", class="form-control") + option(value="") - Anrede - + option(value="Herr") Herr + option(value="Frau") Frau + option(value="Divers") Divers + div(class='form-group col-md-2') + select#inputTitle(name="inputTitle", class="form-control") + option(value="") - Titel - + option(value="Prof.") Prof. + option(value="Dr.") Dr. + option(value="Dipl.-Ing.") Dipl.-Ing. + div(class='form-group col-md-4') + input#inputFirstname(name="inputFirstname", type="text", class="form-control", placeholder="Vorname*", maxlength="45" required) + div(class='form-group col-md-4') + input#inputLastname(name="inputLastname", type="text", class="form-control", placeholder="Nachname*", maxlength="45" required) + div(class="form-group") + input#inputOrganisation(name="inputOrganisation", type="text", class="form-control", placeholder="Unternehmen", maxlength="45") + div(class="form-group") + input#inputIndustry(name="inputIndustry", type="text", class="form-control", placeholder="Branche", maxlength="45") + div(class="form-group") + input#inputSpeciality(name="inputSpeciality", type="text", class="form-control", placeholder="Fachgebiete", maxlength="100") + div(class="pt-2 mb-3 form-check") + input(class="form-check-input" type="checkbox" id="privacyPolicy" name="privacyPolicy" required) + label(class="form-check-label" for="privacyPolicy") + | Ich akzeptiere die <a href="/datenschutz.html" target="_blank">Datenschutzerklärung</a>. * + p <em><small>* Pflichtfeld</small></em> + input#submitBtn(type="submit", class="btn btn-outline-dark btn-block", value="Senden" disabled) + br + p(class="text-center") Sie haben bereits ein Benutzerkonto? <a href="/account/">Melden Sie sich hier an</a>. + + + // jQuery + 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") + // Bootstrap + script(src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous") + // toggle password + script(src='https://unpkg.com/bootstrap-show-password@1.2.1/dist/bootstrap-show-password.min.js') + // M4_LAB + script(src="/js/generalFunction.js") + script(src="/js/registration.js") + script(src="/js/headfoot.js") + script(src="/js/mobile.js") diff --git a/built/views/DE/account/reset.pug b/built/views/DE/account/reset.pug new file mode 100644 index 00000000..e81e1166 --- /dev/null +++ b/built/views/DE/account/reset.pug @@ -0,0 +1,42 @@ +doctype html +html(lang="de") + head + title= "Reset Password" + meta(charset="UTF-8") + meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no") + link(rel="stylesheet", type="text/css", href="/css/bootstrap.min.css") + link(rel="stylesheet", type="text/css", href="/css/m4lab.css") + link(rel="stylesheet", type="text/css", href="/css/m4lab-mobile.css") + link(rel="stylesheet", type="text/css", href="/css/custom/login.css") + link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous") + body + div(class="container-fluid") + div(class="row") + div(class="col-md-6 offset-md-3") + if successes + for success in successes + div.alert.alert-success.alert-dismissible #{ success } + a(class="close", href="#", data-dismiss="alert", aria-label="close") × + if errors + for error, i in errors + div.alert.alert-danger.alert-dismissible.fade.show #{ error } + a(class="close", href="#", data-dismiss="alert", aria-label="close") × + form#forgotForm(method="POST", class="form-signin") + img(src="https://transfer.hft-stuttgart.de/img/M4_LAB_LOGO.png", class="img-responsive center-block", width="185", height="192") + div(class="form-row") + input#inputNewPwd(name="inputNewPwd", type="password", class="form-control", placeholder="Neues Passwort" required) + span#recommendation(class='warning') + input#inputConfirm(name="inputConfirm", type="password", class="form-control", placeholder="Passwort bestätigen" required) + span#message(class='warning') + input#updateBtn(type="submit", class="btn btn-outline-dark btn-block", value="Passwort ändern" disabled) + + // jQuery + 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") + // Bootstrap + script(src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous") + // M4_LAB + script(src="/js/security.js") + script(src="/js/generalFunction.js") + script(src="/js/headfoot.js") + script(src="/js/mobile.js") \ No newline at end of file diff --git a/built/views/DE/account/security.pug b/built/views/DE/account/security.pug new file mode 100644 index 00000000..0ebfc3b2 --- /dev/null +++ b/built/views/DE/account/security.pug @@ -0,0 +1,94 @@ +doctype html +html(lang="de") + head + title= "User Profile" + meta(charset="UTF-8") + meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no") + link(rel="stylesheet", type="text/css", href="/css/bootstrap.min.css") + link(rel="stylesheet", type="text/css", href="/css/m4lab.css") + link(rel="stylesheet", type="text/css", href="/css/m4lab-mobile.css") + link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous") + style. + .warning { + font-size: 11px; + } + body + div(class="container") + div(class="row min-vh-100 flex-column flex-md-row") + aside(class="col-12 col-md-3 p-0 flex-shrink-1") + nav(class="navbar navbar-expand flex-md-column flex-row align-items-start py-2") + div(class="collapse navbar-collapse") + ul(class="flex-md-column flex-row navbar-nav w-100 justify-content-between") + li(class="nav-item") + a(class="nav-link pl-0 text-nowrap" href="/account/") + span(class="font-weight-bold color_black") #{user.firstName} #{user.lastName} + li(class="nav-item") + a(class="nav-link pl-0" href="/account/profile") + i(class="fa fa-user fa-fw") + span(class="d-none d-md-inline") Benutzerprofil + li(class="nav-item") + a(class="nav-link pl-0" href="#") + i(class="fa fa-lock fa-fw color_black") + span(class="d-none d-md-inline color_black") Sicherheitseinstellungen + li(class="nav-item") + a(class="nav-link pl-0" href="/account/services") + i(class="fa fa-tasks fa-fw") + span(class="d-none d-md-inline") Projekte und Dienste + li(class="nav-item") + a(class="nav-link pl-0 color_red" href="/logout") + i(class="fa fa-sign-out-alt fa-fw") + span(class="d-none d-md-inline") Logout + main(class="col bg-faded py-3 flex-grow-1") + if flash.success + div.alert.alert-success.alert-dismissible #{flash.success} + a(class="close", href="#", data-dismiss="alert", aria-label="close") × + if flash.error + div.alert.alert-danger.alert-dismissible.fade.show #{flash.error} + a(class="close", href="#", data-dismiss="alert", aria-label="close") × + form(class="needs-validation", method="post", action="/account/changePwd" novalidate) + div(class="form-row") + div(class='form-group col-md-8') + label(for="currPwd") Aktuelles Passwort + input(id="inputCurrPwd", name="inputCurrPwd", type="password", class="form-control" required) + div(class="invalid-feedback") Bitte füllen Sie dieses Feld aus. + div(class="form-row") + div(class='form-group col-md-8') + label(for="newPwd") Neues Passwort + input#inputNewPwd(name="inputNewPwd", type="password", class="form-control" required) + span#recommendation + div(class="invalid-feedback") Bitte füllen Sie dieses Feld aus. + div(class="form-row") + div(class='form-group col-md-8') + label(for="confirm") Bestätigen Sie das neue Passwort + input#inputConfirm(name="inputConfirm", type="password", class="form-control" required) + span#message + div(class="invalid-feedback") Bitte füllen Sie dieses Feld aus. + input#updateBtn(type="submit", class="btn btn-primary", value="Passwort ändern" disabled) + + // jQuery + 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") + // Bootstrap + script(src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous") + // M4_LAB + script(src="/js/security.js") + script(src="/js/generalFunction.js") + script(src="/js/headfoot.js") + script(src="/js/mobile.js") + script. + // check input fields + 'use strict'; + window.addEventListener('load', function() { + // Fetch all the forms we want to apply custom Bootstrap validation styles to + var forms = document.getElementsByClassName('needs-validation'); + // Loop over them and prevent submission + var validation = Array.prototype.filter.call(forms, function(form) { + form.addEventListener('submit', function(event) { + if (form.checkValidity() === false) { + event.preventDefault(); + event.stopPropagation(); + } + form.classList.add('was-validated'); + }, false); + }); + }, false); diff --git a/built/views/DE/account/services.pug b/built/views/DE/account/services.pug new file mode 100644 index 00000000..5d0df5d8 --- /dev/null +++ b/built/views/DE/account/services.pug @@ -0,0 +1,101 @@ +doctype html +html(lang="de") + head + title= "User Profile" + meta(charset="UTF-8") + meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no") + link(rel="stylesheet", type="text/css", href="/css/bootstrap.min.css") + link(rel="stylesheet", type="text/css", href="/css/m4lab.css") + link(rel="stylesheet", type="text/css", href="/css/m4lab-mobile.css") + link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous") + body + div(class="container") + div(class="row min-vh-100 flex-column flex-md-row") + aside(class="col-12 col-md-3 p-0 flex-shrink-1") + nav(class="navbar navbar-expand flex-md-column flex-row align-items-start py-2") + div(class="collapse navbar-collapse") + ul(class="flex-md-column flex-row navbar-nav w-100 justify-content-between") + li(class="nav-item") + a(class="nav-link pl-0 text-nowrap" href="/") + span(class="font-weight-bold color_black") #{user.firstName} #{user.lastName} + li(class="nav-item") + a(class="nav-link pl-0" href="/account/profile") + i(class="fa fa-user fa-fw") + span(class="d-none d-md-inline") Benutzerprofil + if user.is_m4lab_idp + li(class="nav-item") + a(class="nav-link pl-0" href="/account/security") + i(class="fa fa-lock fa-fw") + span(class="d-none d-md-inline") Sicherheitseinstellungen + li(class="nav-item") + a(class="nav-link pl-0" href="#") + i(class="fa fa-tasks fa-fw color_black") + span(class="d-none d-md-inline color_black") Projekte und Dienste + li(class="nav-item") + a(class="nav-link pl-0 color_red" href="/logout") + i(class="fa fa-sign-out-alt fa-fw") + span(class="d-none d-md-inline") Logout + main(class="col bg-faded py-3 flex-grow-1") + nav(aria-label="breadcrumb") + ol(class="breadcrumb") + li(class="breadcrumb-item") + a(href="/account/") Konto + li(class="breadcrumb-item active" aria-current="page") Projekte und Dienste + + div(class="container") + h3(class="pb-2") Dienste + div(class="col-sm-12") + //p Auf dieser Seite werden in Zukunft Funktionen bereitgestellt, um Ihre Beteiligung an Projekten und Aktivierung von Diensten zu organisieren. Diese Funktionen stehen zurzeit aber noch nicht zur Verfügung. + p Auf dieser Seite werden in Zukunft Funktionen bereitgestellt, um Ihre Aktivierung von Diensten zu organisieren. Diese Funktionen stehen zurzeit aber noch nicht zur Verfügung. + hr + div(class="container") + h3(class="pb-2") Projekte + div(class="col-sm-12") + if user.gitlabUserId + div(class="container") + div(class="row py-2 bg-light") + div(class="col font-weight-bold") Projektinformationen + div(class="col text-right") + a(href="/account/newInformation" class="btn btn-sm btn-success" role="button") Neue Projektinformation + table(class="table") + if gitlabPages.length == 0 + tr + td Currently you have no project information + else + for item in gitlabPages + - let editNewPageLink = "/account/updateInformation?id="+item.projectInformation.id + - let websiteURL = "https://transfer.hft-stuttgart.de/pages/"+item.projectInformation.path+"/home/" + tr + td + img(src=item.projectInformation.logo, width="45", height="45") + td + a(href=editNewPageLink class="link-dark") #{item.projectInformation.name} + td + a(href=websiteURL class="link-dark" target="_blank") visit website + div(class="container") + div(class="row py-2 bg-light") + div(class="col font-weight-bold") Projektcode und -daten + div(class="col text-right") + button(type="button", class="btn btn-sm btn-success" disabled) Neuer Projektdatensatz + table(class="table") + if gitlabRepos.length == 0 + tr + td Currently you have no project codes/data + for item in gitlabRepos + - let img = item.logo + tr + td + img(src=img, width="45", height="45") + td #{item.name} + else + p + | Bitte <a href="https://transfer.hft-stuttgart.de/gitlab" target="_blank">melden Sie sich an der Gitlab-Instanz an</a>, um Ihren Zugang zu aktivieren, und aktualisieren Sie diese Seite. + + // jQuery + 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") + // Bootstrap + script(src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous") + // M4_LAB + script(src="/js/headfoot.js") + script(src="/js/mobile.js") diff --git a/built/views/DE/account/updateInformation.pug b/built/views/DE/account/updateInformation.pug new file mode 100644 index 00000000..130dd95e --- /dev/null +++ b/built/views/DE/account/updateInformation.pug @@ -0,0 +1,156 @@ +doctype html +html(lang="de") + head + title= "Update a website" + meta(charset="UTF-8") + meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no") + link(rel="stylesheet", type="text/css", href="/css/bootstrap.min.css") + link(rel="stylesheet", type="text/css", href="/css/m4lab.css") + link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous") + body + div(class="container") + div(class="row min-vh-100 flex-column flex-md-row") + aside(class="col-12 col-md-3 p-0 flex-shrink-1") + nav(class="navbar navbar-expand flex-md-column flex-row align-items-start py-2") + div(class="collapse navbar-collapse") + ul(class="flex-md-column flex-row navbar-nav w-100 justify-content-between") + li(class="nav-item") + a(class="nav-link pl-0 text-nowrap" href="/account/") + span(class="font-weight-bold" style="color:black;") #{user.firstName} #{user.lastName} + li(class="nav-item") + a(class="nav-link pl-0" href="/account/profile") + i(class="fa fa-user fa-fw") + span(class="d-none d-md-inline") Benutzerprofil + if user.is_m4lab_idp + li(class="nav-item") + a(class="nav-link pl-0" href="/account/security") + i(class="fa fa-lock fa-fw") + span(class="d-none d-md-inline") Sicherheitseinstellungen + li(class="nav-item") + a(class="nav-link pl-0" href="/account/services") + i(class="fa fa-tasks fa-fw" style="color:black;") + span(class="d-none d-md-inline" style="color:black;") Projekte und Dienste + li(class="nav-item") + a(class="nav-link pl-0" href="/logout" style="color:red;") + i(class="fa fa-sign-out-alt fa-fw") + span(class="d-none d-md-inline") Logout + main(class="col bg-faded py-3 flex-grow-1") + nav(aria-label="breadcrumb") + ol(class="breadcrumb") + li(class="breadcrumb-item") + a(href="/account/") Konto + li(class="breadcrumb-item") + a(href="/account/services") Projekte und Dienste + li(class="breadcrumb-item active" aria-current="page") Information aktualisieren + + if flash.success + div.alert.alert-success.alert-dismissible #{flash.success} + a(class="close", href="#", data-dismiss="alert", aria-label="close") × + if flash.error + div.alert.alert-danger.alert-dismissible.fade.show #{flash.error} + a(class="close", href="#", data-dismiss="alert", aria-label="close") × + h3(class="pb-2") Information aktualisieren + div(class="mx-4") + form(method="POST", encType="multipart/form-data") + div(class='form-group row') + label(for="name", class="col-sm-2") Name + div(class="col-sm-8") + input#name(name="name", type="text", class="form-control", value=information.name, placeholder="Name", maxlength="75" required) + div(class="form-group row") + label(for="description", class="col-sm-2") Beschreibung + div(class="col-sm-8") + textarea#description(name="description", type="text", class="form-control", placeholder="Beschreibung", maxlength="500" required) #{information.desc} + div(class="form-group row") + label(for="logo", class="col-sm-2") Projektlogo + div(class="col-sm-8") + div(class="form-group row") + img(src=information.logo, width="100" height="100") + div(class="form-group row") + input#logo(name="logo", class="form-control-file", type="file") + p <small>(Max file size is 80 KB.)</small> + input(type="submit", class="btn btn-primary", value="Speichern") + hr + div(class="mx-4") + p <b><i>[ANMERKUNG]</b></i> Bitte stellen Sie sicher in GitLab, dass sie Folgendes abgeschlossen haben, bevor Sie Ihre Webseite veröffentlichen: + div(class="help") + div(class="card") + - let indexLink = "https://transfer.hft-stuttgart.de/gitlab/"+information.path+"/-/edit/master/public/home/index.html" + - let settingLink = "https://transfer.hft-stuttgart.de/gitlab/"+information.path+"/-/edit/master/public/settings.js" + div(class="card-header") + div(class="card-title") + | <a class="collapsed" data-toggle="collapse" href="#collapse-index" aria-expanded="false" aria-controls="collapse-index"> + | 1. Bearbeiten Sie ihre <i>index.html</i></a> + div(id="collapse-index" class="card-body collapse") + ol + li Klicken Sie <a href=#{indexLink} target="_blank"><i>hier</i></a>, um Ihre <i>index.html</i> in GitLab zu öffnen. + li Bearbeiten Sie ihre Datei. + li Um die Änderungen zu speichern und auf ihrer Seite sofort zu übernehmen, klicken Sie auf <i>Commit changes</i> + img(src="/img/help/save_file.png", class="img-fluid", style="border: 1px solid gray;", alt="index.html") + li Sobald Sie Änderungen an Ihrer <i>index.html</i> vornehmen, wird Ihre Website veröffentlicht. + div(class="card-header") + div(class="card-title") + | <a class="collapsed" data-toggle="collapse" href="#collapse-setting" aria-expanded="false" aria-controls="collapse-setting">2. Anpassen der Einstellungen in <i>settings.js</i></a> + div(id="collapse-setting" class="card-body collapse") + ol + li Klicken Sie <a href=#{settingLink} target="_blank"><i>settings.js</i></a>, um Ihre <i>settings.js</i> in GitLab zu öffnen. + li Bearbeiten Sie ihre Datei. + li Hier sehen Sie die Standardwerde für Soziale Netzwerke und persönliche Webseiten eines Teilnehmers sowie den Standardavatar. Es wird empfohlen, diese Werte nicht zu ändern, aber Sie können weitere Soziale Netzwerke hinzufügen. + img(src="/img/help/default_settings.png", class="img-fluid", style="border: 1px solid gray;") + li Diese Schalter kontrollieren, welche Teile der gitlab-Seite angezeigt werden sollen. Wenn Sie also beispielsweise nur eine einzige Seite haben, benötigen Sie kein Menü und können den Wert für 'menu' auf OFF stellen. + img(src="/img/help/switches.png", class="img-fluid", style="border: 1px solid gray;") + li Hier ändern Sie das Projektlogo. Das Logo wird am oberen Rand der Seite mittig angezeigt. Wenn der Schalter für 'project logo' auf OFF steht, wird es nicht angezeigt. + img(src="/img/help/pr_logo.png", class="img-fluid", style="border: 1px solid gray;") + li Hier ändern Sie das Menü Ihrer gitlab-Seite. Ein Menü kann entweder auf einen Unterordner/ template verweisen oder aber auf einen externen Link, z.B. eine Demo. Sie können Menüeinträge hinzufügen oder entfernen. Das Menü wird mit dem Schalter 'OFF' verborgen. Vergessen Sie nicht den Schrägstrich am Ende eines Menülinks, wenn dieser auf einen Ordner zeigt. + img(src="/img/help/menu.png", class="img-fluid", style="border: 1px solid gray;") + li Hier ändern Sie die Teilnehmenden. Sie können die Standardwerte für Soziale Netzwerke (diese beinhalten die HFT-Kanäle) oder Ihr eigenen Profile verwenden. Sie können auf Ihre persönliche Webseite verlinken. Sie können soziale Netzwerke hinzufügen oder entfernen. Sie können auch einen persönlichen Avatar oder den Standard-Avatar (DEFAULT.avatar) verwenden. + img(src="/img/help/partic.png", class="img-fluid", style="border: 1px solid gray;") + li Hier ist ein Beispiel mit zwei Teilnehmenden: + img(src="/img/help/partic2.png", class="img-fluid", style="border: 1px solid gray;") + li Hier ändern Sie die Fußzeilenlogos z.B. zu denen von Projektpartnern. Wenn Sie das Logo nicht mit einer externen Webseite verlinken wollen, verwenden Sie EMPTY_LINK als Wert für href. Der Titel title wird bei Mouse-Hover über dem Logo erscheinen. + img(src="/img/help/f_logos.png", class="img-fluid", style="border: 1px solid gray;") + li Klicken Sie anschließend auf <i>Commit changes</i>, um die Änderungen zu speichern. + img(src="/img/help/edit_settings_generic.png", class="img-fluid", style="border: 1px solid gray;") + + hr + div(class="mx-4") + div(class="alert alert-danger" role="alert") <h5><strong>Webseite löschen</strong></h5> + p Dies wird <strong><em>#{information.name}</em></strong> sofort endgültig löschen, inklusive ihrer Repositorien und aller zugehöriger Ressourcen. + p Sind Sie WIRKLICH SICHER, dass Sie diese Webseite löschen wollen? + button(type="button" class="btn btn-danger" data-toggle="modal" data-target="#deleteWebsiteConfirmation") Löschen + + // Modal + div(class="modal" id="deleteWebsiteConfirmation" tabindex="-1" role="dialog" aria-labelledby="modalLabel" aria-hidden="true") + div(class="modal-dialog" role="document") + div(class="modal-content") + div(class="modal-header") + h5(class="modal-title" id="modalLabel") Sind Sie WIRKLICH SICHER? + button(type="button" class="close" data-dismiss="modal" aria-label="Close") + span(aria-hidden="true") × + div(class="modal-body") + | <p>Sie sind dabei, diese Webseite, ihr Repositorium und alle zugehörigen Ressourcen, inklusive aller Inhalte, Bilder etc. endgültig zu löschen.</p> + | <p>Sobald eine Webseite endgültig gelöscht ist, kann sie nicht wiederhergestellt werden. <strong>Diese Aktion kann nicht rückgängig gemacht werden.</strong></p> + div(class="modal-footer") + form(method="POST", action="/account/deleteProject?_method=DELETE", encType="multipart/form-data") + input(name="id", value=information.id, type="hidden") + button(type="button" class="btn btn-primary mx-2" data-dismiss="modal") Abbrechen, Webseite behalten + button(type="submit" class="btn btn-danger") Ja, Webseite löschen + + // jQuery + 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") + // jquery-loading-overlay + script(src="https://cdn.jsdelivr.net/npm/gasparesganga-jquery-loading-overlay@2.1.7/dist/loadingoverlay.min.js") + // Bootstrap + script(src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous") + // M4_LAB + script(src="/js/headfoot.js") + script. + function sendPublishRequest() { + $.post("/sendPublishRequest", {projectName: $("#name").val()}, function(resp){ + alert(resp) + }) + } + + $("form").submit(function(){ + $.LoadingOverlay("show") + }); \ No newline at end of file diff --git a/built/views/DE/account/verification.pug b/built/views/DE/account/verification.pug new file mode 100644 index 00000000..805cceb5 --- /dev/null +++ b/built/views/DE/account/verification.pug @@ -0,0 +1,36 @@ +doctype html +html(lang="de") + head + title= "User Verification" + meta(charset="UTF-8") + meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no") + link(rel="stylesheet", type="text/css", href="/css/bootstrap.min.css") + link(rel="stylesheet", type="text/css", href="/css/m4lab.css") + style. + .container { + height: 400px; + position: relative; + } + .center { + margin: 0; + position: absolute; + top: 50%; + left: 50%; + -ms-transform: translate(-50%, -50%); + transform: translate(-50%, -50%); + } + body + div(class="container") + div(class="center", align="center") + a(href="https://transfer.hft-stuttgart.de") + img(src="https://transfer.hft-stuttgart.de/images/demo/m4lab_logo.jpg", class="img-responsive center-block", width="185", height="192") + br + br + if status == true + p(class="h5") Ihr Benutzerkonto wurde bestätigt. Bitte <a href="https://transfer.hft-stuttgart.de/account/">melden Sie sich an</a>. + else if status == false + p(class="h5") Ihr Benutzerkonto konnte nicht bestätigt werden, bitte versuchen Sie es erneut. + else + p(class="h5") Ihr Benutzerkonto wurde nicht gefunden. + // Bootstrap + script(src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous") \ No newline at end of file diff --git a/built/views/DE/project/updateProjectOverview.pug b/built/views/DE/project/updateProjectOverview.pug new file mode 100644 index 00000000..e69de29b diff --git a/built/views/EN/404.pug b/built/views/EN/404.pug new file mode 100644 index 00000000..dc9e0a8c --- /dev/null +++ b/built/views/EN/404.pug @@ -0,0 +1,4 @@ +extends error + +block content + h2 Cannot find #{url} \ No newline at end of file diff --git a/built/views/EN/500.pug b/built/views/EN/500.pug new file mode 100644 index 00000000..cbc47e79 --- /dev/null +++ b/built/views/EN/500.pug @@ -0,0 +1,8 @@ +extends error + +block content + h1 Error: #{error.message} + if settings['verbose errors'] + pre= error.stack + else + p An error ocurred! \ No newline at end of file diff --git a/built/views/EN/account/forgotPwd.pug b/built/views/EN/account/forgotPwd.pug new file mode 100644 index 00000000..7688a512 --- /dev/null +++ b/built/views/EN/account/forgotPwd.pug @@ -0,0 +1,56 @@ +doctype html +html(lang="en") + head + title= "Forgot Password" + meta(charset="UTF-8") + meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no") + link(rel="stylesheet", type="text/css", href="/css/bootstrap.css") + link(rel="stylesheet", type="text/css", href="/css/custom/login.css") + link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous") + style. + .collapse { + display: none; + } + .collapse.in { + display: block; + } + .collapsing { + position: relative; + height: 0; + overflow: hidden; + -webkit-transition-timing-function: ease; + -o-transition-timing-function: ease; + transition-timing-function: ease; + -webkit-transition-duration: .35s; + -o-transition-duration: .35s; + transition-duration: .35s; + -webkit-transition-property: height,visibility; + -o-transition-property: height,visibility; + transition-property: height,visibility; + } + body + div(class="container-fluid") + div(class="row") + div(class="col-md-6 offset-md-3") + if successes + for success in successes + div.alert.alert-success.alert-dismissible #{ success } + a(class="close", href="#", data-dismiss="alert", aria-label="close") × + if errors + for error, i in errors + div.alert.alert-danger.alert-dismissible.fade.show #{ error } + a(class="close", href="#", data-dismiss="alert", aria-label="close") × + form#forgotForm(class="form-signin", method="POST") + img(src="https://transfer.hft-stuttgart.de/images/demo/m4lab_logo.jpg", class="img-responsive center-block", width="185", height="192") + div(class="form-row") + input#inputEmail(name="inputEmail", type="email", class="form-control", placeholder="Email" required) + br + input(type="submit", class="btn btn-outline-dark btn-block", value="Reset Password") + + // jQuery + 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") + // Bootstrap + script(src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous") + // M4_LAB + script(src="/js/headfoot.js") diff --git a/built/views/EN/account/home.pug b/built/views/EN/account/home.pug new file mode 100644 index 00000000..df71fe18 --- /dev/null +++ b/built/views/EN/account/home.pug @@ -0,0 +1,49 @@ +doctype html +html(lang="en") + head + title= "User Account" + meta(charset="UTF-8") + meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no") + link(rel="stylesheet", type="text/css", href="/css/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") + style. + .collapse { + display: none; + } + .collapse.in { + display: block; + } + .collapsing { + position: relative; + height: 0; + overflow: hidden; + -webkit-transition-timing-function: ease; + -o-transition-timing-function: ease; + transition-timing-function: ease; + -webkit-transition-duration: .35s; + -o-transition-duration: .35s; + transition-duration: .35s; + -webkit-transition-property: height,visibility; + -o-transition-property: height,visibility; + transition-property: height,visibility; + } + body + div(class="container-fluid") + div(class="row") + div(class="col-3") + h5 + span #{user.firstname} #{user.lastname} + div(class="nav flex-column nav-pills", id="v-pills-tab", role="tablist", aria-orientation="vertical") + a(class="nav-link" href="/profile" aria-selected="true") Profile + a(class="nav-link" href="/security" aria-selected="false") Security + a(class="nav-link" href="/services" aria-selected="false") Services + div(class="col-sm-9") + p content goes here + + // jQuery + 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") + // Bootstrap + script(src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous") + // M4_LAB + script(src="/js/headfootLogout.js") \ No newline at end of file diff --git a/built/views/EN/account/profile.pug b/built/views/EN/account/profile.pug new file mode 100644 index 00000000..60788795 --- /dev/null +++ b/built/views/EN/account/profile.pug @@ -0,0 +1,95 @@ +doctype html +html(lang="en") + head + title= "User Profile" + meta(charset="UTF-8") + meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no") + link(rel="stylesheet", type="text/css", href="/css/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") + style. + .collapse { + display: none; + } + .collapse.in { + display: block; + } + .collapsing { + position: relative; + height: 0; + overflow: hidden; + -webkit-transition-timing-function: ease; + -o-transition-timing-function: ease; + transition-timing-function: ease; + -webkit-transition-duration: .35s; + -o-transition-duration: .35s; + transition-duration: .35s; + -webkit-transition-property: height,visibility; + -o-transition-property: height,visibility; + transition-property: height,visibility; + } + body + div(class="container-fluid") + div(class="row") + div(class="col-3") + h5 + span #{user.firstname} #{user.lastname} + div(class="nav flex-column nav-pills", id="v-pills-tab", role="tablist", aria-orientation="vertical") + a(class="nav-link" href="#" aria-selected="true") Profile + a(class="nav-link" href="/security" aria-selected="false") Security + a(class="nav-link" href="/services" aria-selected="false") Services + div(class="col-sm-9") + if successes + for success in successes + div.alert.alert-success.alert-dismissible #{ success } + a(class="close", href="#", data-dismiss="alert", aria-label="close") × + if errors + for error, i in errors + div.alert.alert-danger.alert-dismissible.fade.show #{ error } + a(class="close", href="#", data-dismiss="alert", aria-label="close") × + form#profileForm(method="POST", action="/updateProfile") + div(class="form-row") + div(class='form-group col-md-2') + label(for="title") Title + select#inputTitle(name="inputTitle", class="form-control", value=user.title) + option(value="Frau/Herr") Frau/Herr + option(value="Frau") Frau + option(value="Herr") Herr + option(value="Dr.") Dr. + option(value="Prof. Dr.") Prof. Dr. + script. + var titleOptions = document.getElementById('inputTitle').options; + for (i=0; i < titleOptions.length; i++) { + if (titleOptions[i].value == '#{user.title}') + titleOptions[i].selected = true; + } + div(class='form-group col-md-3') + label(for="firstname") Vorname + input#inputFirstname(name="inputFirstname", type="text", class="form-control", placeholder="Vorname", value=user.firstname required) + div(class='form-group col-md-3') + label(for="lastname") Nachname + input#inputLastname(name="inputLastname", type="text", class="form-control", placeholder="Nachname", value=user.lastname required) + div(class="form-row") + div(class='form-group col-md-8') + label(for="email") Email + input#inputEmail(name="inputEmail", type="email", class="form-control", placeholder="Email", value=email required) + div(class="form-row") + div(class='form-group col-md-8') + label(for="organisation") Unternehmen + input#inputOrganisation(name="inputOrganisation", type="text", class="form-control", placeholder="Unternehmen", value=user.organisation) + div(class="form-row") + div(class='form-group col-md-8') + label(for="industry") Branche + input#inputIndustry(name="inputIndustry", type="text", class="form-control", placeholder="Branche", value=user.industry) + div(class="form-row") + div(class='form-group col-md-8') + label(for="speciality") Fachgebiete + input#inputSpeciality(name="inputSpeciality", type="text", class="form-control", placeholder="Fachgebiete", value=user.speciality) + input(type="submit", class="btn btn-primary", value="Update") + + // jQuery + 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") + // Bootstrap + script(src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous") + // M4_LAB + script(src="/js/headfootLogout.js") \ No newline at end of file diff --git a/built/views/EN/account/registration.pug b/built/views/EN/account/registration.pug new file mode 100644 index 00000000..25096b15 --- /dev/null +++ b/built/views/EN/account/registration.pug @@ -0,0 +1,92 @@ +doctype html +html(lang="en") + head + title= "Create New Account" + meta(charset="UTF-8") + meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no") + link(rel="stylesheet", type="text/css", href="/css/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") + style. + .collapse { + display: none; + } + .collapse.in { + display: block; + } + .collapsing { + position: relative; + height: 0; + overflow: hidden; + -webkit-transition-timing-function: ease; + -o-transition-timing-function: ease; + transition-timing-function: ease; + -webkit-transition-duration: .35s; + -o-transition-duration: .35s; + transition-duration: .35s; + -webkit-transition-property: height,visibility; + -o-transition-property: height,visibility; + transition-property: height,visibility; + } + .warning { + color: red; + font-size: 11px; + } + body + div(class="container-fluid") + div(class="row") + div(class="col-md-6 offset-md-2") + h3(class="mb-3 font-weight-bold") Create New Account + div(class="col-md-6 offset-md-3") + if successes + for success in successes + div.alert.alert-success.alert-dismissible #{ success } + a(class="close", href="#", data-dismiss="alert", aria-label="close") × + if errors + for error, i in errors + div.alert.alert-danger.alert-dismissible.fade.show #{ error } + a(class="close", href="#", data-dismiss="alert", aria-label="close") × + form(method="POST") + h5(class="mb-3 font-weight-bold") Login Data + div(class='form-row') + div(class='form-group col-md-6') + input#inputEmail(name="inputEmail", type="email", class="form-control", placeholder="Email*" required) + span#emailWarning(class='warning') + div(class="form-group col-md-6") + input#inputPassword(name="inputPassword", type="password", class="form-control", data-toggle="password", placeholder="Password*" required) + span#passwordWarning(class='warning') + h5(class="mb-3 font-weight-bold") Profile Data + div(class="form-row") + div(class='form-group col-md-4') + select#inputTitle(name="inputTitle", class="form-control") + option(value="Frau/Herr") Frau/Herr + option(value="Frau") Frau + option(value="Herr") Herr + option(value="Dr.") Dr. + option(value="Prof. Dr.") Prof. Dr. + div(class='form-group col-md-4') + input#inputFirstname(name="inputFirstname", type="text", class="form-control", placeholder="Vorname*" required) + div(class='form-group col-md-4') + input#inputLastname(name="inputLastname", type="text", class="form-control", placeholder="Nachname*" required) + div(class="form-group") + input#inputOrganisation(name="inputOrganisation", type="text", class="form-control", placeholder="Unternehmen") + div(class="form-group") + input#inputIndustry(name="inputIndustry", type="text", class="form-control", placeholder="Branche") + div(class="form-group") + input#inputSpeciality(name="inputSpeciality", type="text", class="form-control", placeholder="Fachgebiete") + p <em><small>* Mandatory</small></em> + input#submitBtn(type="submit", class="btn btn-outline-dark btn-block", value="Submit" disabled) + br + p(class="text-center") Already have an account? <a href="/">Login</a>. + + + // jQuery + 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") + // Bootstrap + script(src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous") + // toggle password + script(src='https://unpkg.com/bootstrap-show-password@1.2.1/dist/bootstrap-show-password.min.js') + // M4_LAB + script(src="/js/generalFunction.js") + script(src="/js/registration.js") + script(src="/js/headfoot.js") \ No newline at end of file diff --git a/built/views/EN/account/reset.pug b/built/views/EN/account/reset.pug new file mode 100644 index 00000000..610a914e --- /dev/null +++ b/built/views/EN/account/reset.pug @@ -0,0 +1,60 @@ +doctype html +html(lang="en") + head + title= "Reset Password" + meta(charset="UTF-8") + meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no") + link(rel="stylesheet", type="text/css", href="/css/bootstrap.css") + link(rel="stylesheet", type="text/css", href="/css/custom/login.css") + link(rel="stylesheet", href="https://use.fontawesome.com/releases/v5.8.2/css/all.css", integrity="sha384-oS3vJWv+0UjzBfQzYUhtDYW+Pj2yciDJxpsK1OYPAYjqT085Qq/1cq5FLXAZQ7Ay", crossorigin="anonymous") + style. + .collapse { + display: none; + } + .collapse.in { + display: block; + } + .collapsing { + position: relative; + height: 0; + overflow: hidden; + -webkit-transition-timing-function: ease; + -o-transition-timing-function: ease; + transition-timing-function: ease; + -webkit-transition-duration: .35s; + -o-transition-duration: .35s; + transition-duration: .35s; + -webkit-transition-property: height,visibility; + -o-transition-property: height,visibility; + transition-property: height,visibility; + } + body + div(class="container-fluid") + div(class="row") + div(class="col-md-6 offset-md-3") + if successes + for success in successes + div.alert.alert-success.alert-dismissible #{ success } + a(class="close", href="#", data-dismiss="alert", aria-label="close") × + if errors + for error, i in errors + div.alert.alert-danger.alert-dismissible.fade.show #{ error } + a(class="close", href="#", data-dismiss="alert", aria-label="close") × + form#forgotForm(method="POST", class="form-signin") + img(src="https://transfer.hft-stuttgart.de/images/demo/m4lab_logo.jpg", class="img-responsive center-block", width="185", height="192") + div(class="form-row") + input#inputNewPwd(name="inputNewPwd", type="password", class="form-control", placeholder="New Password" required) + span#recommendation(class='warning') + input#inputConfirm(name="inputConfirm", type="password", class="form-control", placeholder="Confirm Password" required) + span#message(class='warning') + input#updateBtn(type="submit", class="btn btn-outline-dark btn-block", value="Update Password" disabled) + + // jQuery + 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") + // Bootstrap + script(src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous") + // M4_LAB + script(src="/js/security.js") + script(src="/js/generalFunction.js") + script(src="/js/headfoot.js") diff --git a/built/views/EN/account/security.pug b/built/views/EN/account/security.pug new file mode 100644 index 00000000..c2c997b0 --- /dev/null +++ b/built/views/EN/account/security.pug @@ -0,0 +1,94 @@ +doctype html +html(lang="en") + head + title= "User Profile" + meta(charset="UTF-8") + meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no") + link(rel="stylesheet", type="text/css", href="/css/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") + style. + .collapse { + display: none; + } + .collapse.in { + display: block; + } + .collapsing { + position: relative; + height: 0; + overflow: hidden; + -webkit-transition-timing-function: ease; + -o-transition-timing-function: ease; + transition-timing-function: ease; + -webkit-transition-duration: .35s; + -o-transition-duration: .35s; + transition-duration: .35s; + -webkit-transition-property: height,visibility; + -o-transition-property: height,visibility; + transition-property: height,visibility; + } + .warning { + font-size: 11px; + } + body + div(class="container-fluid") + div(class="row") + div(class="col-3") + h5 + span #{user.firstName} #{user.lastName} + div(class="nav flex-column nav-pills", id="v-pills-tab", role="tablist", aria-orientation="vertical") + a(class="nav-link" href="/profile" aria-selected="true") Profile + a(class="nav-link" href="#" aria-selected="false") Security + a(class="nav-link" href="/services" aria-selected="false") Services + div(class="col-sm-9") + if successes + for success in successes + div.alert.alert-success.alert-dismissible #{ success } + a(class="close", href="#", data-dismiss="alert", aria-label="close") × + if errors + for error, i in errors + div.alert.alert-danger.alert-dismissible.fade.show #{ error } + a(class="close", href="#", data-dismiss="alert", aria-label="close") × + form(class="needs-validation", method="post", action="/account/changePwd" novalidate) + div(class="form-group row") + label(for="currPwd") Current Password + input(id="inputCurrPwd", name="inputCurrPwd", type="password", class="form-control" required) + div(class="invalid-feedback") Please fill in this field. + div(class="form-group row") + label(for="newPwd") New Password + input#inputNewPwd(name="inputNewPwd", type="password", class="form-control" required) + span#recommendation + div(class="invalid-feedback") Please fill in this field. + div(class="form-group row") + label(for="confirm") Confirm New Password + input#inputConfirm(name="inputConfirm", type="password", class="form-control" required) + span#message + div(class="invalid-feedback") Please fill in this field. + input#updateBtn(type="submit", class="btn btn-primary", value="Update Password" disabled) + + // jQuery + 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") + // Bootstrap + script(src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous") + // M4_LAB + script(src="/js/security.js") + script(src="/js/generalFunction.js") + script(src="/js/headfootLogout.js") + script. + // check input fields + 'use strict'; + window.addEventListener('load', function() { + // Fetch all the forms we want to apply custom Bootstrap validation styles to + var forms = document.getElementsByClassName('needs-validation'); + // Loop over them and prevent submission + var validation = Array.prototype.filter.call(forms, function(form) { + form.addEventListener('submit', function(event) { + if (form.checkValidity() === false) { + event.preventDefault(); + event.stopPropagation(); + } + form.classList.add('was-validated'); + }, false); + }); + }, false); diff --git a/built/views/EN/account/services.pug b/built/views/EN/account/services.pug new file mode 100644 index 00000000..c70d729f --- /dev/null +++ b/built/views/EN/account/services.pug @@ -0,0 +1,77 @@ +doctype html +html(lang="en") + head + title= "User Profile" + meta(charset="UTF-8") + meta(name="viewport", content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no") + link(rel="stylesheet", type="text/css", href="/css/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") + style. + .collapse { + display: none; + } + .collapse.in { + display: block; + } + .collapsing { + position: relative; + height: 0; + overflow: hidden; + -webkit-transition-timing-function: ease; + -o-transition-timing-function: ease; + transition-timing-function: ease; + -webkit-transition-duration: .35s; + -o-transition-duration: .35s; + transition-duration: .35s; + -webkit-transition-property: height,visibility; + -o-transition-property: height,visibility; + transition-property: height,visibility; + } + body + div(class="container-fluid") + div(class="row") + div(class="col-3") + h5 + span #{user.firstName} #{user.lastName} + div(class="nav flex-column nav-pills", id="v-pills-tab", role="tablist", aria-orientation="vertical") + a(class="nav-link" href="/profile" aria-selected="true") Profile + a(class="nav-link" href="/security" aria-selected="false") Security + a(class="nav-link" href="#" aria-selected="false") Services + div(class="col-sm-9") + if successes + for success in successes + div.alert.alert-success.alert-dismissible #{ success } + a(class="close", href="#", data-dismiss="alert", aria-label="close") × + if errors + for error, i in errors + div.alert.alert-danger.alert-dismissible.fade.show #{ error } + a(class="close", href="#", data-dismiss="alert", aria-label="close") × + table + for item in project + tr + td <strong>#{item.title}</strong> + if item.userStatus + td + button(type="button", class="btn btn-secondary", onclick="unsubscribe()") Unsubscribe + else + td + button(type="button", class="btn btn-success", onclick="subscribe()") Subscribe + tr + td(colspan="2") #{item.summary} + tr + td(colspan="2") <i>Contact Person: #{item.cp}</i> + + // jQuery + 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") + // Bootstrap + script(src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous") + // M4_LAB + script(src="/js/headfootLogout.js") + script. + function subscribe() { + alert("To be implemented: Send a request to join/participate/have access to the page of the requested service") + } + function unsubscribe() { + alert("To be implemented: Send a request to withdraw access") + } \ No newline at end of file -- GitLab