├── .classpath ├── .gitignore ├── .project ├── README.md ├── application.properties ├── grails-app ├── assets │ ├── fonts │ │ └── font-awesome │ │ │ ├── FontAwesome.otf │ │ │ ├── fontawesome-webfont.eot │ │ │ ├── fontawesome-webfont.svg │ │ │ ├── fontawesome-webfont.ttf │ │ │ └── fontawesome-webfont.woff │ ├── images │ │ ├── apple-touch-icon-retina.png │ │ ├── apple-touch-icon.png │ │ ├── demo │ │ │ ├── demo.js │ │ │ ├── less-1.7.0.js │ │ │ ├── logo-big.png │ │ │ ├── pricing-bg.jpg │ │ │ ├── signin-bg-1.jpg │ │ │ └── themes │ │ │ │ ├── adminflare.png │ │ │ │ ├── asphalt.png │ │ │ │ ├── clean.png │ │ │ │ ├── default.png │ │ │ │ ├── dust.png │ │ │ │ ├── fresh.png │ │ │ │ ├── frost.png │ │ │ │ ├── purple-hills.png │ │ │ │ ├── silver.png │ │ │ │ └── white.png │ │ ├── favicon.ico │ │ ├── grails_logo.png │ │ ├── main-navbar-logo.png │ │ ├── pixel-admin │ │ │ ├── avatar.png │ │ │ ├── blank.png │ │ │ ├── blur.svg │ │ │ ├── default.jpg │ │ │ ├── main-menu-bg.png │ │ │ ├── main-navbar-bg.png │ │ │ └── main-navbar-logo.png │ │ ├── plugins │ │ │ ├── bootstrap-editable │ │ │ │ └── loading.gif │ │ │ └── jquery.minicolors.png │ │ ├── skin │ │ │ ├── database_add.png │ │ │ ├── database_delete.png │ │ │ ├── database_edit.png │ │ │ ├── database_save.png │ │ │ ├── database_table.png │ │ │ ├── exclamation.png │ │ │ ├── house.png │ │ │ ├── information.png │ │ │ ├── shadow.jpg │ │ │ ├── sorted_asc.gif │ │ │ └── sorted_desc.gif │ │ ├── spinner.gif │ │ ├── springsource.png │ │ └── themes │ │ │ ├── adminflare │ │ │ ├── body-bg.png │ │ │ ├── ie-navbar-bg.png │ │ │ └── menu-bg.png │ │ │ └── clean │ │ │ └── body-bg.gif │ ├── javascripts │ │ ├── application.js │ │ ├── bootstrap-editable-demo.js │ │ ├── bootstrap-editable-demo.min.js │ │ ├── bootstrap.js │ │ ├── bootstrap.min.js │ │ ├── demo-mock.js │ │ ├── demo-mock.min.js │ │ ├── ie.js │ │ ├── ie.min.js │ │ ├── jquery-ui-extras.js │ │ ├── jquery-ui-extras.min.js │ │ ├── jquery.base64.js │ │ ├── jquery.cookie.js │ │ ├── jquery.mockjax.js │ │ ├── jquery.mockjax.min.js │ │ ├── pixel-admin.js │ │ ├── pixel-admin.min.js │ │ └── prism.js │ └── stylesheets │ │ ├── application.css │ │ ├── bootstrap.css │ │ ├── bootstrap.min.css │ │ ├── errors.css │ │ ├── main.css │ │ ├── mobile.css │ │ ├── pages.css │ │ ├── pages.min.css │ │ ├── pixel-admin.css │ │ ├── pixel-admin.min.css │ │ ├── prism-coy.css │ │ ├── rtl.css │ │ ├── rtl.min.css │ │ ├── themes.css │ │ ├── themes.min.css │ │ ├── widgets.css │ │ └── widgets.min.css ├── conf │ ├── BootStrap.groovy │ ├── BuildConfig.groovy │ ├── Config.groovy │ ├── DataSource.groovy │ ├── UrlMappings.groovy │ ├── grails_nV │ │ ├── LoggingFilters.groovy │ │ └── SessionFilters.groovy │ └── spring │ │ └── resources.groovy ├── controllers │ └── grails_nV │ │ ├── AdminController.groovy │ │ ├── CompaniesController.groovy │ │ ├── ListingsController.groovy │ │ ├── MainController.groovy │ │ ├── MessagesController.groovy │ │ ├── ProfileController.groovy │ │ ├── SessionController.groovy │ │ ├── TutorialsController.groovy │ │ └── UserController.groovy ├── domain │ └── grails_nV │ │ ├── Company.groovy │ │ ├── JobListing.groovy │ │ ├── Log.groovy │ │ ├── Message.groovy │ │ └── User.groovy ├── i18n │ ├── messages.properties │ ├── messages_cs_CZ.properties │ ├── messages_da.properties │ ├── messages_de.properties │ ├── messages_es.properties │ ├── messages_fr.properties │ ├── messages_it.properties │ ├── messages_ja.properties │ ├── messages_nb.properties │ ├── messages_nl.properties │ ├── messages_pl.properties │ ├── messages_pt_BR.properties │ ├── messages_pt_PT.properties │ ├── messages_ru.properties │ ├── messages_sv.properties │ ├── messages_th.properties │ └── messages_zh_CN.properties ├── migrations │ ├── 2014-05-28-added-default-user-values.groovy │ ├── 2014-05-28-added-job-listing.groovy │ ├── 2014-05-28-added-updated-constraints.groovy │ ├── 2014-05-28-added-updated-nullability.groovy │ ├── 2014-05-28-initial-database.groovy │ ├── 2014-05-29-added-job-listing-company.groovy │ ├── 2014-05-29-added-nullability-on-auth_token.groovy │ ├── 2014-05-29-added-nullable-created.groovy │ ├── 2014-05-29-updated-token-fields-again.groovy │ ├── 2014-05-29-updated-token-fields.groovy │ ├── 2014-05-30-added-user-description.groovy │ ├── 2014-05-30-user-resumes.groovy │ ├── 2014-06-02-added-field-constraints.groovy │ ├── 2014-06-02-added-fullname-to-user.groovy │ ├── 2014-06-02-added-log-constraints.groovy │ ├── 2014-06-02-added-log-nullables.groovy │ ├── 2014-06-02-added-messages.groovy │ ├── 2014-06-02-added-user-access-level.groovy │ ├── 2014-06-02-added-user-lockout-fields.groovy │ ├── 2014-06-02-added-user-reset-token.groovy │ ├── 2014-06-02-analytics.groovy │ ├── 2014-06-02-changed-field-types-again-again.groovy │ ├── 2014-06-02-changed-field-types-again.groovy │ ├── 2014-06-02-changed-field-types.groovy │ ├── 2014-06-02-more-message-tweaks.groovy │ ├── 2014-06-04-added-user-ssn.groovy │ ├── 2014-06-24-adding-employees.groovy │ └── changelog.groovy └── views │ ├── admin │ ├── edit.gsp │ └── index.gsp │ ├── companies │ ├── create.gsp │ ├── index.gsp │ └── update.gsp │ ├── error.gsp │ ├── layouts │ ├── loggedin.gsp │ └── tutorials.gsp │ ├── listings │ ├── create.gsp │ ├── index.gsp │ ├── search.gsp │ └── update.gsp │ ├── main │ ├── index.gsp │ └── search.gsp │ ├── messages │ ├── index.gsp │ └── send.gsp │ ├── profile │ ├── edit.gsp │ ├── profile.gsp │ └── uploadresume.gsp │ ├── tutorials │ ├── acclockout.gsp │ ├── adminconsole.gsp │ ├── authfiltering.gsp │ ├── csrf.gsp │ ├── index.gsp │ ├── infodisclosure.gsp │ ├── insecuredoa.gsp │ ├── insecureredirect.gsp │ ├── logicflaws.gsp │ ├── massassign.gsp │ ├── sessionfixation.gsp │ ├── sessiontimeout.gsp │ ├── sqlinjection.gsp │ ├── usernameenumeration.gsp │ ├── validators.gsp │ ├── weakcomplexity.gsp │ ├── xssdom.gsp │ ├── xssgsp.gsp │ └── xssjs.gsp │ └── user │ ├── resetaccount.gsp │ ├── resetpassword.gsp │ ├── signin.gsp │ └── signup.gsp ├── grailsw ├── grailsw.bat ├── initial-setup.sh ├── src └── templates │ ├── artifacts │ ├── Controller.groovy │ ├── DomainClass.groovy │ ├── Filters.groovy │ ├── ScaffoldingController.groovy │ ├── Script.groovy │ ├── Service.groovy │ ├── TagLib.groovy │ ├── Tests.groovy │ └── WebTest.groovy │ ├── scaffolding │ ├── AsyncController.groovy │ ├── AsyncSpec.groovy │ ├── Controller.groovy │ ├── RestfulController.groovy │ ├── RestfulSpec.groovy │ ├── Spec.groovy │ ├── _form.gsp │ ├── create.gsp │ ├── edit.gsp │ ├── index.gsp │ ├── renderEditor.template │ └── show.gsp │ ├── testing │ ├── CliTests.groovy │ ├── Controller.groovy │ ├── DomainClass.groovy │ ├── Filters.groovy │ ├── Generic.groovy │ ├── Integration.groovy │ ├── Service.groovy │ ├── TagLib.groovy │ └── UnitTest.groovy │ └── war │ └── web.xml ├── test ├── codenarc │ ├── InscureGORMQueryRule.groovy │ ├── InsecureHashFunctionRule.groovy │ ├── InsecureMassAssignmentRule.groovy │ ├── InsecureRedirectRule.groovy │ └── TestRuleSet.groovy └── unit │ ├── com │ └── grails.nV │ │ ├── UserControllerSpec.groovy │ │ └── UserSpec.groovy │ └── grails.nV │ ├── CompaniesControllerSpec.groovy │ ├── CompanySpec.groovy │ ├── JobListingSpec.groovy │ ├── ListingsControllerSpec.groovy │ ├── LogSpec.groovy │ ├── LoggingFiltersSpec.groovy │ ├── MainControllerSpec.groovy │ ├── MessageSpec.groovy │ ├── MessagesControllerSpec.groovy │ ├── ProfileControllerSpec.groovy │ ├── SessionControllerSpec.groovy │ ├── SessionFiltersSpec.groovy │ ├── TutorialsControllerSpec.groovy │ └── UserControllerSpec.groovy ├── web-app ├── WEB-INF │ ├── applicationContext.xml │ ├── sitemesh.xml │ └── tld │ │ ├── c.tld │ │ ├── fmt.tld │ │ ├── grails.tld │ │ ├── spring-form.tld │ │ └── spring.tld └── uploads │ └── .gitkeep └── wrapper ├── grails-wrapper-runtime-2.4.0.jar ├── grails-wrapper.properties └── springloaded-1.2.0.RELEASE.jar /.classpath: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.iws 2 | *Db.properties 3 | *Db.script 4 | .settings 5 | stacktrace.log 6 | /*.zip 7 | /plugin.xml 8 | /*.log 9 | /*DB.* 10 | /cobertura.ser 11 | .DS_Store 12 | /target/ 13 | /out/ 14 | /web-app/plugins 15 | /web-app/WEB-INF/classes 16 | /.link_to_grails_plugins/ 17 | /target-eclipse/ 18 | web-app/uploads 19 | -------------------------------------------------------------------------------- /.project: -------------------------------------------------------------------------------- 1 | 2 | 3 | grails_nV 4 | 5 | 6 | 7 | 8 | 9 | org.eclipse.jdt.core.javabuilder 10 | 11 | 12 | 13 | 14 | 15 | org.grails.ide.eclipse.core.nature 16 | org.eclipse.jdt.groovy.core.groovyNature 17 | org.eclipse.jdt.core.javanature 18 | 19 | 20 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | grails_nV 2 | ========== 3 | 4 | grails_nV is a vulnerable jobs listing website. 5 | 6 | More information about grails_nV and its vulnerabilities can be found [here](https://github.com/nVisium/grails_nV/wiki) 7 | 8 | Setup 9 | ----- 10 | 11 | Before setting up, you will need to have the JDK installed. Simply having the JRE is not enough. OpenJDK works well, but there 12 | are other options as well. 13 | 14 | To set up Groovy, we recommend using the GVM, which allows for easy installation. 15 | 16 | curl -s get.gvmtool.net | bash 17 | source "$HOME/.gvm/bin/gvm-init.sh" 18 | gvm install groovy 19 | 20 | Afterwards, you can easily install Grails. 21 | 22 | gvm install grails 23 | 24 | To set up the database, run the initial setup script provided in the directory. 25 | 26 | chmod +x initial-setup.sh 27 | ./initial-setup.sh 28 | 29 | By default, grails_nV uses the build in H2 database stored on disc. However, the ```grails-app\conf\DataSource.groovy``` and ```initial-setup.sh``` have commented out settings to switch to MySQL if that's preferable. 30 | 31 | To view any mail sent from the application, navigate to ```http://localhost:8080/grails_nV/greenmail```. grails_nV uses the in-memory GreenMail mailserver. 32 | 33 | Finally, to actually run the app, simply run 34 | 35 | grails run-app 36 | 37 | The app should then be accessible at ```http://localhost:8080/grails_nV/``` 38 | 39 | If your ```grails``` prompt shows the following message 40 | 41 | Class JavaLaunchHelper is implemented in both /Library/Java/JavaVirtualMachines/jdk1.7.0_60.jdk/Contents/Home/bin/java and /Library/Java/JavaVirtualMachines/jdk1.7.0_60.jdk/Contents/Home/jre/lib/libinstrument.dylib. One of the two will be used. Which one is undefined 42 | 43 | You can safely ignore it. The above is a JVM error unrelated to grails_nV 44 | 45 | Updating the Database 46 | --------------------- 47 | 48 | Database updates use migrations. To update the database, change the domain files and then tell grails to update the migrations. 49 | 50 | When the app starts, it will automatically bring the schema up to date. 51 | 52 | grails dbm-update 53 | grails dbm-gorm-diff YYYY-MM-DD-added-blah-blah.groovy --add 54 | 55 | (from http://grails.github.io/grails-howtos/en/manageDatabases.html) 56 | 57 | CodeNarc 58 | -------- 59 | 60 | You can run CodeNarc, a Groovy static analysis tool, on the codebase using the grails command 61 | 62 | grails codenarc 63 | 64 | It will generate a report, located at ```target\CodeNarcReport.html```, with information about issues detected by the CodeNarc ruleset. If you're interested in customizing the rules run, the selected rulesets are in ```grails-app\conf\BuildConfig.groovy``` and custom rules are located in the ```test\codenarc``` folder. 65 | -------------------------------------------------------------------------------- /application.properties: -------------------------------------------------------------------------------- 1 | #Grails Metadata file 2 | #Tue May 26 11:38:42 EDT 2015 3 | app.grails.version=2.5.0 4 | app.name=grails_nV 5 | app.servlet.version=3.0 6 | app.version=2.4.1 7 | -------------------------------------------------------------------------------- /grails-app/assets/fonts/font-awesome/FontAwesome.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetSPI/grails-nV/848f932d4b115313836b1959083ec475e25e57ec/grails-app/assets/fonts/font-awesome/FontAwesome.otf -------------------------------------------------------------------------------- /grails-app/assets/fonts/font-awesome/fontawesome-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetSPI/grails-nV/848f932d4b115313836b1959083ec475e25e57ec/grails-app/assets/fonts/font-awesome/fontawesome-webfont.eot -------------------------------------------------------------------------------- /grails-app/assets/fonts/font-awesome/fontawesome-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetSPI/grails-nV/848f932d4b115313836b1959083ec475e25e57ec/grails-app/assets/fonts/font-awesome/fontawesome-webfont.ttf -------------------------------------------------------------------------------- /grails-app/assets/fonts/font-awesome/fontawesome-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetSPI/grails-nV/848f932d4b115313836b1959083ec475e25e57ec/grails-app/assets/fonts/font-awesome/fontawesome-webfont.woff -------------------------------------------------------------------------------- /grails-app/assets/images/apple-touch-icon-retina.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetSPI/grails-nV/848f932d4b115313836b1959083ec475e25e57ec/grails-app/assets/images/apple-touch-icon-retina.png -------------------------------------------------------------------------------- /grails-app/assets/images/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetSPI/grails-nV/848f932d4b115313836b1959083ec475e25e57ec/grails-app/assets/images/apple-touch-icon.png -------------------------------------------------------------------------------- /grails-app/assets/images/demo/logo-big.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetSPI/grails-nV/848f932d4b115313836b1959083ec475e25e57ec/grails-app/assets/images/demo/logo-big.png -------------------------------------------------------------------------------- /grails-app/assets/images/demo/pricing-bg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetSPI/grails-nV/848f932d4b115313836b1959083ec475e25e57ec/grails-app/assets/images/demo/pricing-bg.jpg -------------------------------------------------------------------------------- /grails-app/assets/images/demo/signin-bg-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetSPI/grails-nV/848f932d4b115313836b1959083ec475e25e57ec/grails-app/assets/images/demo/signin-bg-1.jpg -------------------------------------------------------------------------------- /grails-app/assets/images/demo/themes/adminflare.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetSPI/grails-nV/848f932d4b115313836b1959083ec475e25e57ec/grails-app/assets/images/demo/themes/adminflare.png -------------------------------------------------------------------------------- /grails-app/assets/images/demo/themes/asphalt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetSPI/grails-nV/848f932d4b115313836b1959083ec475e25e57ec/grails-app/assets/images/demo/themes/asphalt.png -------------------------------------------------------------------------------- /grails-app/assets/images/demo/themes/clean.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetSPI/grails-nV/848f932d4b115313836b1959083ec475e25e57ec/grails-app/assets/images/demo/themes/clean.png -------------------------------------------------------------------------------- /grails-app/assets/images/demo/themes/default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetSPI/grails-nV/848f932d4b115313836b1959083ec475e25e57ec/grails-app/assets/images/demo/themes/default.png -------------------------------------------------------------------------------- /grails-app/assets/images/demo/themes/dust.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetSPI/grails-nV/848f932d4b115313836b1959083ec475e25e57ec/grails-app/assets/images/demo/themes/dust.png -------------------------------------------------------------------------------- /grails-app/assets/images/demo/themes/fresh.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetSPI/grails-nV/848f932d4b115313836b1959083ec475e25e57ec/grails-app/assets/images/demo/themes/fresh.png -------------------------------------------------------------------------------- /grails-app/assets/images/demo/themes/frost.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetSPI/grails-nV/848f932d4b115313836b1959083ec475e25e57ec/grails-app/assets/images/demo/themes/frost.png -------------------------------------------------------------------------------- /grails-app/assets/images/demo/themes/purple-hills.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetSPI/grails-nV/848f932d4b115313836b1959083ec475e25e57ec/grails-app/assets/images/demo/themes/purple-hills.png -------------------------------------------------------------------------------- /grails-app/assets/images/demo/themes/silver.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetSPI/grails-nV/848f932d4b115313836b1959083ec475e25e57ec/grails-app/assets/images/demo/themes/silver.png -------------------------------------------------------------------------------- /grails-app/assets/images/demo/themes/white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetSPI/grails-nV/848f932d4b115313836b1959083ec475e25e57ec/grails-app/assets/images/demo/themes/white.png -------------------------------------------------------------------------------- /grails-app/assets/images/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetSPI/grails-nV/848f932d4b115313836b1959083ec475e25e57ec/grails-app/assets/images/favicon.ico -------------------------------------------------------------------------------- /grails-app/assets/images/grails_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetSPI/grails-nV/848f932d4b115313836b1959083ec475e25e57ec/grails-app/assets/images/grails_logo.png -------------------------------------------------------------------------------- /grails-app/assets/images/main-navbar-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetSPI/grails-nV/848f932d4b115313836b1959083ec475e25e57ec/grails-app/assets/images/main-navbar-logo.png -------------------------------------------------------------------------------- /grails-app/assets/images/pixel-admin/avatar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetSPI/grails-nV/848f932d4b115313836b1959083ec475e25e57ec/grails-app/assets/images/pixel-admin/avatar.png -------------------------------------------------------------------------------- /grails-app/assets/images/pixel-admin/blank.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetSPI/grails-nV/848f932d4b115313836b1959083ec475e25e57ec/grails-app/assets/images/pixel-admin/blank.png -------------------------------------------------------------------------------- /grails-app/assets/images/pixel-admin/blur.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /grails-app/assets/images/pixel-admin/default.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetSPI/grails-nV/848f932d4b115313836b1959083ec475e25e57ec/grails-app/assets/images/pixel-admin/default.jpg -------------------------------------------------------------------------------- /grails-app/assets/images/pixel-admin/main-menu-bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetSPI/grails-nV/848f932d4b115313836b1959083ec475e25e57ec/grails-app/assets/images/pixel-admin/main-menu-bg.png -------------------------------------------------------------------------------- /grails-app/assets/images/pixel-admin/main-navbar-bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetSPI/grails-nV/848f932d4b115313836b1959083ec475e25e57ec/grails-app/assets/images/pixel-admin/main-navbar-bg.png -------------------------------------------------------------------------------- /grails-app/assets/images/pixel-admin/main-navbar-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetSPI/grails-nV/848f932d4b115313836b1959083ec475e25e57ec/grails-app/assets/images/pixel-admin/main-navbar-logo.png -------------------------------------------------------------------------------- /grails-app/assets/images/plugins/bootstrap-editable/loading.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetSPI/grails-nV/848f932d4b115313836b1959083ec475e25e57ec/grails-app/assets/images/plugins/bootstrap-editable/loading.gif -------------------------------------------------------------------------------- /grails-app/assets/images/plugins/jquery.minicolors.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetSPI/grails-nV/848f932d4b115313836b1959083ec475e25e57ec/grails-app/assets/images/plugins/jquery.minicolors.png -------------------------------------------------------------------------------- /grails-app/assets/images/skin/database_add.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetSPI/grails-nV/848f932d4b115313836b1959083ec475e25e57ec/grails-app/assets/images/skin/database_add.png -------------------------------------------------------------------------------- /grails-app/assets/images/skin/database_delete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetSPI/grails-nV/848f932d4b115313836b1959083ec475e25e57ec/grails-app/assets/images/skin/database_delete.png -------------------------------------------------------------------------------- /grails-app/assets/images/skin/database_edit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetSPI/grails-nV/848f932d4b115313836b1959083ec475e25e57ec/grails-app/assets/images/skin/database_edit.png -------------------------------------------------------------------------------- /grails-app/assets/images/skin/database_save.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetSPI/grails-nV/848f932d4b115313836b1959083ec475e25e57ec/grails-app/assets/images/skin/database_save.png -------------------------------------------------------------------------------- /grails-app/assets/images/skin/database_table.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetSPI/grails-nV/848f932d4b115313836b1959083ec475e25e57ec/grails-app/assets/images/skin/database_table.png -------------------------------------------------------------------------------- /grails-app/assets/images/skin/exclamation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetSPI/grails-nV/848f932d4b115313836b1959083ec475e25e57ec/grails-app/assets/images/skin/exclamation.png -------------------------------------------------------------------------------- /grails-app/assets/images/skin/house.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetSPI/grails-nV/848f932d4b115313836b1959083ec475e25e57ec/grails-app/assets/images/skin/house.png -------------------------------------------------------------------------------- /grails-app/assets/images/skin/information.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetSPI/grails-nV/848f932d4b115313836b1959083ec475e25e57ec/grails-app/assets/images/skin/information.png -------------------------------------------------------------------------------- /grails-app/assets/images/skin/shadow.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetSPI/grails-nV/848f932d4b115313836b1959083ec475e25e57ec/grails-app/assets/images/skin/shadow.jpg -------------------------------------------------------------------------------- /grails-app/assets/images/skin/sorted_asc.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetSPI/grails-nV/848f932d4b115313836b1959083ec475e25e57ec/grails-app/assets/images/skin/sorted_asc.gif -------------------------------------------------------------------------------- /grails-app/assets/images/skin/sorted_desc.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetSPI/grails-nV/848f932d4b115313836b1959083ec475e25e57ec/grails-app/assets/images/skin/sorted_desc.gif -------------------------------------------------------------------------------- /grails-app/assets/images/spinner.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetSPI/grails-nV/848f932d4b115313836b1959083ec475e25e57ec/grails-app/assets/images/spinner.gif -------------------------------------------------------------------------------- /grails-app/assets/images/springsource.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetSPI/grails-nV/848f932d4b115313836b1959083ec475e25e57ec/grails-app/assets/images/springsource.png -------------------------------------------------------------------------------- /grails-app/assets/images/themes/adminflare/body-bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetSPI/grails-nV/848f932d4b115313836b1959083ec475e25e57ec/grails-app/assets/images/themes/adminflare/body-bg.png -------------------------------------------------------------------------------- /grails-app/assets/images/themes/adminflare/ie-navbar-bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetSPI/grails-nV/848f932d4b115313836b1959083ec475e25e57ec/grails-app/assets/images/themes/adminflare/ie-navbar-bg.png -------------------------------------------------------------------------------- /grails-app/assets/images/themes/adminflare/menu-bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetSPI/grails-nV/848f932d4b115313836b1959083ec475e25e57ec/grails-app/assets/images/themes/adminflare/menu-bg.png -------------------------------------------------------------------------------- /grails-app/assets/images/themes/clean/body-bg.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetSPI/grails-nV/848f932d4b115313836b1959083ec475e25e57ec/grails-app/assets/images/themes/clean/body-bg.gif -------------------------------------------------------------------------------- /grails-app/assets/javascripts/application.js: -------------------------------------------------------------------------------- 1 | // This is a manifest file that'll be compiled into application.js. 2 | // 3 | // Any JavaScript file within this directory can be referenced here using a relative path. 4 | // 5 | // You're free to add application-wide JavaScript to this file, but it's generally better 6 | // to create separate JavaScript files as needed. 7 | // 8 | 9 | //= require ie 10 | //= require bootstrap 11 | //= require jquery-ui-extras. 12 | //= require jquery.mockjax 13 | //= require jquery.cookie 14 | //= require jquery.base64 15 | //= require pixel-admin 16 | //= require prism 17 | 18 | function resetForm() { 19 | var values = $.parseJSON($.base64.decode($.cookie("user"))); 20 | $("#firstname").val(values['firstname']); 21 | $("#lastname").val(values['lastname']); 22 | $("#description").val(values['description']); 23 | $("#email").val(values['email']); 24 | } 25 | 26 | 27 | $(document).ready(function() { 28 | if ( $("#search-form").length ) { 29 | // base64 the search query for security! 30 | $('#search-form').on('submit', function(e) { 31 | e.preventDefault(); //prevent form from submitting 32 | window.location.href = $("#search-form").attr("action") + "?q=" + window.btoa($("#q").val()); 33 | }); 34 | } 35 | }); -------------------------------------------------------------------------------- /grails-app/assets/javascripts/demo-mock.js: -------------------------------------------------------------------------------- 1 | $(function(){function a(a,b){var c,d=[];d.push(a.type.toUpperCase()+' url = "'+a.url+'"');for(var e in a.data){if(a.data[e]&&"object"==typeof a.data[e]){c=[];for(var f in a.data[e])c.push(f+': "'+a.data[e][f]+'"');c="{ "+c.join(", ")+" }"}else c='"'+a.data[e]+'"';d.push(e+" = "+c)}d.push("RESPONSE: status = "+b.status),b.responseText&&($.isArray(b.responseText)?(d.push("["),$.each(b.responseText,function(a,b){d.push("{value: "+b.value+', text: "'+b.text+'"}')}),d.push("]")):d.push($.trim(b.responseText))),d.push("--------------------------------------\n")}$.mockjaxSettings.responseTime=500,$.mockjax({url:"/post",response:function(b){try{a(b,this)}catch(c){}}}),$.mockjax({url:"/error",status:400,statusText:"Bad Request",response:function(b){this.responseText="Please input correct value";try{a(b,this)}catch(c){}}}),$.mockjax({url:"/status",status:500,response:function(b){this.responseText="Internal Server Error";try{a(b,this)}catch(c){}}}),$.mockjax({url:"/groups",response:function(b){this.responseText=[{value:0,text:"Guest"},{value:1,text:"Service"},{value:2,text:"Customer"},{value:3,text:"Operator"},{value:4,text:"Support"},{value:5,text:"Admin"}];try{a(b,this)}catch(c){}}})}); -------------------------------------------------------------------------------- /grails-app/assets/javascripts/demo-mock.min.js: -------------------------------------------------------------------------------- 1 | $(function(){function a(a,b){var c,d=[];d.push(a.type.toUpperCase()+' url = "'+a.url+'"');for(var e in a.data){if(a.data[e]&&"object"==typeof a.data[e]){c=[];for(var f in a.data[e])c.push(f+': "'+a.data[e][f]+'"');c="{ "+c.join(", ")+" }"}else c='"'+a.data[e]+'"';d.push(e+" = "+c)}d.push("RESPONSE: status = "+b.status),b.responseText&&($.isArray(b.responseText)?(d.push("["),$.each(b.responseText,function(a,b){d.push("{value: "+b.value+', text: "'+b.text+'"}')}),d.push("]")):d.push($.trim(b.responseText))),d.push("--------------------------------------\n")}$.mockjaxSettings.responseTime=500,$.mockjax({"url":"/post","response":function(b){try{a(b,this)}catch(c){}}}),$.mockjax({"url":"/error","status":400,"statusText":"Bad Request","response":function(b){this.responseText="Please input correct value";try{a(b,this)}catch(c){}}}),$.mockjax({"url":"/status","status":500,"response":function(b){this.responseText="Internal Server Error";try{a(b,this)}catch(c){}}}),$.mockjax({"url":"/groups","response":function(b){this.responseText=[{"value":0,"text":"Guest"},{"value":1,"text":"Service"},{"value":2,"text":"Customer"},{"value":3,"text":"Operator"},{"value":4,"text":"Support"},{"value":5,"text":"Admin"}];try{a(b,this)}catch(c){}}})}); -------------------------------------------------------------------------------- /grails-app/assets/javascripts/jquery.base64.js: -------------------------------------------------------------------------------- 1 | "use strict";jQuery.base64=(function($){var _PADCHAR="=",_ALPHA="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",_VERSION="1.0";function _getbyte64(s,i){var idx=_ALPHA.indexOf(s.charAt(i));if(idx===-1){throw"Cannot decode base64"}return idx}function _decode(s){var pads=0,i,b10,imax=s.length,x=[];s=String(s);if(imax===0){return s}if(imax%4!==0){throw"Cannot decode base64"}if(s.charAt(imax-1)===_PADCHAR){pads=1;if(s.charAt(imax-2)===_PADCHAR){pads=2}imax-=4}for(i=0;i>16,(b10>>8)&255,b10&255))}switch(pads){case 1:b10=(_getbyte64(s,i)<<18)|(_getbyte64(s,i+1)<<12)|(_getbyte64(s,i+2)<<6);x.push(String.fromCharCode(b10>>16,(b10>>8)&255));break;case 2:b10=(_getbyte64(s,i)<<18)|(_getbyte64(s,i+1)<<12);x.push(String.fromCharCode(b10>>16));break}return x.join("")}function _getbyte(s,i){var x=s.charCodeAt(i);if(x>255){throw"INVALID_CHARACTER_ERR: DOM Exception 5"}return x}function _encode(s){if(arguments.length!==1){throw"SyntaxError: exactly one argument required"}s=String(s);var i,b10,x=[],imax=s.length-s.length%3;if(s.length===0){return s}for(i=0;i>18));x.push(_ALPHA.charAt((b10>>12)&63));x.push(_ALPHA.charAt((b10>>6)&63));x.push(_ALPHA.charAt(b10&63))}switch(s.length-imax){case 1:b10=_getbyte(s,i)<<16;x.push(_ALPHA.charAt(b10>>18)+_ALPHA.charAt((b10>>12)&63)+_PADCHAR+_PADCHAR);break;case 2:b10=(_getbyte(s,i)<<16)|(_getbyte(s,i+1)<<8);x.push(_ALPHA.charAt(b10>>18)+_ALPHA.charAt((b10>>12)&63)+_ALPHA.charAt((b10>>6)&63)+_PADCHAR);break}return x.join("")}return{decode:_decode,encode:_encode,VERSION:_VERSION}}(jQuery)); -------------------------------------------------------------------------------- /grails-app/assets/javascripts/jquery.cookie.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * jQuery Cookie Plugin v1.4.1 3 | * https://github.com/carhartl/jquery-cookie 4 | * 5 | * Copyright 2013 Klaus Hartl 6 | * Released under the MIT license 7 | */ 8 | (function (factory) { 9 | if (typeof define === 'function' && define.amd) { 10 | // AMD 11 | define(['jquery'], factory); 12 | } else if (typeof exports === 'object') { 13 | // CommonJS 14 | factory(require('jquery')); 15 | } else { 16 | // Browser globals 17 | factory(jQuery); 18 | } 19 | }(function ($) { 20 | 21 | var pluses = /\+/g; 22 | 23 | function encode(s) { 24 | return config.raw ? s : encodeURIComponent(s); 25 | } 26 | 27 | function decode(s) { 28 | return config.raw ? s : decodeURIComponent(s); 29 | } 30 | 31 | function stringifyCookieValue(value) { 32 | return encode(config.json ? JSON.stringify(value) : String(value)); 33 | } 34 | 35 | function parseCookieValue(s) { 36 | if (s.indexOf('"') === 0) { 37 | // This is a quoted cookie as according to RFC2068, unescape... 38 | s = s.slice(1, -1).replace(/\\"/g, '"').replace(/\\\\/g, '\\'); 39 | } 40 | 41 | try { 42 | // Replace server-side written pluses with spaces. 43 | // If we can't decode the cookie, ignore it, it's unusable. 44 | // If we can't parse the cookie, ignore it, it's unusable. 45 | s = decodeURIComponent(s.replace(pluses, ' ')); 46 | return config.json ? JSON.parse(s) : s; 47 | } catch(e) {} 48 | } 49 | 50 | function read(s, converter) { 51 | var value = config.raw ? s : parseCookieValue(s); 52 | return $.isFunction(converter) ? converter(value) : value; 53 | } 54 | 55 | var config = $.cookie = function (key, value, options) { 56 | 57 | // Write 58 | 59 | if (value !== undefined && !$.isFunction(value)) { 60 | options = $.extend({}, config.defaults, options); 61 | 62 | if (typeof options.expires === 'number') { 63 | var days = options.expires, t = options.expires = new Date(); 64 | t.setTime(+t + days * 864e+5); 65 | } 66 | 67 | return (document.cookie = [ 68 | encode(key), '=', stringifyCookieValue(value), 69 | options.expires ? '; expires=' + options.expires.toUTCString() : '', // use expires attribute, max-age is not supported by IE 70 | options.path ? '; path=' + options.path : '', 71 | options.domain ? '; domain=' + options.domain : '', 72 | options.secure ? '; secure' : '' 73 | ].join('')); 74 | } 75 | 76 | // Read 77 | 78 | var result = key ? undefined : {}; 79 | 80 | // To prevent the for loop in the first place assign an empty array 81 | // in case there are no cookies at all. Also prevents odd result when 82 | // calling $.cookie(). 83 | var cookies = document.cookie ? document.cookie.split('; ') : []; 84 | 85 | for (var i = 0, l = cookies.length; i < l; i++) { 86 | var parts = cookies[i].split('='); 87 | var name = decode(parts.shift()); 88 | var cookie = parts.join('='); 89 | 90 | if (key && key === name) { 91 | // If second argument (value) is a function it's a converter... 92 | result = read(cookie, value); 93 | break; 94 | } 95 | 96 | // Prevent storing a cookie that we couldn't decode. 97 | if (!key && (cookie = read(cookie)) !== undefined) { 98 | result[name] = cookie; 99 | } 100 | } 101 | 102 | return result; 103 | }; 104 | 105 | config.defaults = {}; 106 | 107 | $.removeCookie = function (key, options) { 108 | if ($.cookie(key) === undefined) { 109 | return false; 110 | } 111 | 112 | // Must not alter options, thus extending a fresh object... 113 | $.cookie(key, '', $.extend({}, options, { expires: -1 })); 114 | return !$.cookie(key); 115 | }; 116 | 117 | })); -------------------------------------------------------------------------------- /grails-app/assets/stylesheets/application.css: -------------------------------------------------------------------------------- 1 | /* 2 | * This is a manifest file that'll be compiled into application.css, which will include all the files 3 | * listed below. 4 | * 5 | * Any CSS file within this directory can be referenced here using a relative path. 6 | * 7 | * You're free to add application-wide styles to this file and they'll appear at the top of the 8 | * compiled file, but it's generally better to create a new file per style scope. 9 | * 10 | *require main 11 | *require mobile 12 | *require_self 13 | 14 | *= require bootstrap.min 15 | *= require pages.min 16 | *= require pixel-admin.min 17 | *= require rtl.min 18 | *= require themes.min 19 | *= require widgets.min 20 | *= require prism-coy 21 | */ 22 | -------------------------------------------------------------------------------- /grails-app/assets/stylesheets/errors.css: -------------------------------------------------------------------------------- 1 | h1, h2 { 2 | margin: 10px 25px 5px; 3 | } 4 | 5 | h2 { 6 | font-size: 1.1em; 7 | } 8 | 9 | .filename { 10 | font-style: italic; 11 | } 12 | 13 | .exceptionMessage { 14 | margin: 10px; 15 | border: 1px solid #000; 16 | padding: 5px; 17 | background-color: #E9E9E9; 18 | } 19 | 20 | .stack, 21 | .snippet { 22 | margin: 0 25px 10px; 23 | } 24 | 25 | .stack, 26 | .snippet { 27 | border: 1px solid #ccc; 28 | -mox-box-shadow: 0 0 2px rgba(0,0,0,0.2); 29 | -webkit-box-shadow: 0 0 2px rgba(0,0,0,0.2); 30 | box-shadow: 0 0 2px rgba(0,0,0,0.2); 31 | } 32 | 33 | /* error details */ 34 | .error-details { 35 | border-top: 1px solid #FFAAAA; 36 | -mox-box-shadow: 0 0 2px rgba(0,0,0,0.2); 37 | -webkit-box-shadow: 0 0 2px rgba(0,0,0,0.2); 38 | box-shadow: 0 0 2px rgba(0,0,0,0.2); 39 | border-bottom: 1px solid #FFAAAA; 40 | -mox-box-shadow: 0 0 2px rgba(0,0,0,0.2); 41 | -webkit-box-shadow: 0 0 2px rgba(0,0,0,0.2); 42 | box-shadow: 0 0 2px rgba(0,0,0,0.2); 43 | background-color:#FFF3F3; 44 | line-height: 1.5; 45 | overflow: hidden; 46 | padding: 5px; 47 | padding-left:25px; 48 | } 49 | 50 | .error-details dt { 51 | clear: left; 52 | float: left; 53 | font-weight: bold; 54 | margin-right: 5px; 55 | } 56 | 57 | .error-details dt:after { 58 | content: ":"; 59 | } 60 | 61 | .error-details dd { 62 | display: block; 63 | } 64 | 65 | /* stack trace */ 66 | .stack { 67 | padding: 5px; 68 | overflow: auto; 69 | height: 150px; 70 | } 71 | 72 | /* code snippet */ 73 | .snippet { 74 | background-color: #fff; 75 | font-family: monospace; 76 | } 77 | 78 | .snippet .line { 79 | display: block; 80 | } 81 | 82 | .snippet .lineNumber { 83 | background-color: #ddd; 84 | color: #999; 85 | display: inline-block; 86 | margin-right: 5px; 87 | padding: 0 3px; 88 | text-align: right; 89 | width: 3em; 90 | } 91 | 92 | .snippet .error { 93 | background-color: #fff3f3; 94 | font-weight: bold; 95 | } 96 | 97 | .snippet .error .lineNumber { 98 | background-color: #faa; 99 | color: #333; 100 | font-weight: bold; 101 | } 102 | 103 | .snippet .line:first-child .lineNumber { 104 | padding-top: 5px; 105 | } 106 | 107 | .snippet .line:last-child .lineNumber { 108 | padding-bottom: 5px; 109 | } -------------------------------------------------------------------------------- /grails-app/assets/stylesheets/mobile.css: -------------------------------------------------------------------------------- 1 | /* Styles for mobile devices */ 2 | 3 | @media screen and (max-width: 480px) { 4 | .nav { 5 | padding: 0.5em; 6 | } 7 | 8 | .nav li { 9 | margin: 0 0.5em 0 0; 10 | padding: 0.25em; 11 | } 12 | 13 | /* Hide individual steps in pagination, just have next & previous */ 14 | .pagination .step, .pagination .currentStep { 15 | display: none; 16 | } 17 | 18 | .pagination .prevLink { 19 | float: left; 20 | } 21 | 22 | .pagination .nextLink { 23 | float: right; 24 | } 25 | 26 | /* pagination needs to wrap around floated buttons */ 27 | .pagination { 28 | overflow: hidden; 29 | } 30 | 31 | /* slightly smaller margin around content body */ 32 | fieldset, 33 | .property-list { 34 | padding: 0.3em 1em 1em; 35 | } 36 | 37 | input, textarea { 38 | width: 100%; 39 | -moz-box-sizing: border-box; 40 | -webkit-box-sizing: border-box; 41 | -ms-box-sizing: border-box; 42 | box-sizing: border-box; 43 | } 44 | 45 | select, input[type=checkbox], input[type=radio], input[type=submit], input[type=button], input[type=reset] { 46 | width: auto; 47 | } 48 | 49 | /* hide all but the first column of list tables */ 50 | .scaffold-list td:not(:first-child), 51 | .scaffold-list th:not(:first-child) { 52 | display: none; 53 | } 54 | 55 | .scaffold-list thead th { 56 | text-align: center; 57 | } 58 | 59 | /* stack form elements */ 60 | .fieldcontain { 61 | margin-top: 0.6em; 62 | } 63 | 64 | .fieldcontain label, 65 | .fieldcontain .property-label, 66 | .fieldcontain .property-value { 67 | display: block; 68 | float: none; 69 | margin: 0 0 0.25em 0; 70 | text-align: left; 71 | width: auto; 72 | } 73 | 74 | .errors ul, 75 | .message p { 76 | margin: 0.5em; 77 | } 78 | 79 | .error ul { 80 | margin-left: 0; 81 | } 82 | } 83 | -------------------------------------------------------------------------------- /grails-app/conf/BootStrap.groovy: -------------------------------------------------------------------------------- 1 | import grails_nV.Company 2 | import grails_nV.JobListing 3 | import grails_nV.User 4 | import grails_nV.Message 5 | 6 | class BootStrap { 7 | 8 | def init = { servletContext -> 9 | 10 | if(!Company.count()) { 11 | def leetsec = new Company(name: "LeetSec", description: "Experts in Application Security", website: "https://leetsec.com" ).save(failOnError: true) 12 | def megacorp = new Company(name: "MegaCorp", description: "The best at what we do", website: "http://megacorp.co.jp").save(failOnError: true) 13 | def goatsllc = new Company(name: "GoatS LLC", description: "We provide the best goats, for traditional goat stew", website: "http://goatsforstew.com").save(failOnError: true) 14 | 15 | def job1 = new JobListing(name: "Security Consultant", description: "Responsible for hacking all the things", requirements: "none", howtoapply: "Contact our HR team: megangoat@leetsec.com", location: "Virginia", startdate: new Date(), fulltime: true, company: leetsec).save(failOnError: true) 16 | def job2 = new JobListing(name: "Senior Security Consultant", description: "Manages the rookies", requirements: "3+ years experience in application security. Extensive Grails Experience", howtoapply: "Contact our HR team: megangoat@leetsec.com", location: "Virginia", startdate: new Date(), fulltime: true, company: leetsec).save(failOnError: true) 17 | def job3 = new JobListing(name: "Financial Assistant", description: "Responsible for managing financial tasks, such as investments and purchasing", requirements: "Extensive experience with MS Excel + Access", howtoapply: "Please give us a call at (211) 355-3413 x1337. Ask for Cyrus", location: "Virginia", startdate: new Date(), fulltime: true, company: megacorp).save(failOnError: true) 18 | 19 | def admin = new User(email: "admin@grails.com", firstname: "Admin", lastname: "Admin", fullname: "Admin Admin", password: "password".encodeAsMD5(), verify_token: null, accesslevel: 1).save(failOnError: true) 20 | 21 | def john = new User(email: "john@grails.com", firstname: "John", lastname: "Poulin", fullname: "John Poulin", password: "haX0r!".encodeAsMD5(), verify_token: null, accesslevel: 2).save(failOnError: true) 22 | leetsec.addToEmployees(john).save() 23 | 24 | def jack = new User(email: "jack@l33t.com", firstname: "Jack", lastname: "Edwards", fullname: "Jack Edwards", password: "password".encodeAsMD5(), verify_token: null, accesslevel: 2).save(failOnError: true) 25 | leetsec.addToEmployees(jack).save() 26 | 27 | def james = new User(email: "james@megacorp.gov", firstname: "James", lastname: "Bradley", fullname: "James Bradley", password: "password".encodeAsMD5(), verify_token: null, accesslevel: 0).save(failOnError: true) 28 | megacorp.addToEmployees(james).save() 29 | 30 | def joseph = new User(email: "joseph@megacorp.gov", firstname: "Joseph", lastname: "Nelson", fullname: "Joseph Nelson", password: "password".encodeAsMD5(), verify_token: null, accesslevel: 0).save(failOnError: true) 31 | megacorp.addToEmployees(joseph).save() 32 | 33 | def jeremy = new User(email: "jeremy@goatsllc.org", firstname: "Jeremy", lastname: "Krimper", fullname: "Jeremy Krimper", password: "password".encodeAsMD5(), verify_token: null, accesslevel: 0).save(failOnError: true) 34 | goatsllc.addToEmployees(jeremy).save() 35 | 36 | def message = new Message(subject: "Help with job", body: "Hello Admin, I'm currently looking for help finding a job. Please give me a call, (222) 345-9241", author_id: 2, recipient: admin).save(failOnError: true) 37 | } 38 | } 39 | def destroy = { 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /grails-app/conf/DataSource.groovy: -------------------------------------------------------------------------------- 1 | /*dataSource { 2 | pooled = true 3 | driverClassName = "com.mysql.jdbc.Driver" 4 | dialect = "org.hibernate.dialect.MySQL5InnoDBDialect" 5 | username = "root" 6 | }*/ 7 | dataSource { 8 | pooled = false 9 | driverClassName = "org.h2.Driver" 10 | username = "sa" 11 | password = "" 12 | } 13 | 14 | hibernate { 15 | cache.use_second_level_cache = true 16 | cache.use_query_cache = false 17 | // cache.region.factory_class = 'net.sf.ehcache.hibernate.EhCacheRegionFactory' // Hibernate 3 18 | // cache.region.factory_class = 'org.hibernate.cache.ehcache.EhCacheRegionFactory' // Hibernate 4 19 | cache.region.factory_class = 'org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory' 20 | singleSession = true // configure OSIV singleSession mode 21 | } 22 | 23 | // environment specific settings 24 | environments { 25 | development { 26 | dataSource { 27 | //url = "jdbc:mysql://localhost/grails_nV-dev?useUnicode=yes&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull" 28 | url = "jdbc:h2:devDb" 29 | } 30 | } 31 | test { 32 | dataSource { 33 | //url = "jdbc:mysql://localhost/grails_nV-test?useUnicode=yes&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull" 34 | url = "jdbc:h2:devDb" 35 | } 36 | } 37 | production { 38 | dataSource { 39 | //url = "jdbc:mysql://localhost/grails_nV-prod?useUnicode=yes&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull" 40 | url = "jdbc:h2:devDb" 41 | properties { 42 | // See http://grails.org/doc/latest/guide/conf.html#dataSource for documentation 43 | jmxEnabled = true 44 | initialSize = 5 45 | maxActive = 50 46 | minIdle = 5 47 | maxIdle = 25 48 | maxWait = 10000 49 | maxAge = 10 * 60000 50 | timeBetweenEvictionRunsMillis = 5000 51 | minEvictableIdleTimeMillis = 60000 52 | validationQuery = "SELECT 1" 53 | validationQueryTimeout = 3 54 | validationInterval = 15000 55 | testOnBorrow = true 56 | testWhileIdle = true 57 | testOnReturn = false 58 | jdbcInterceptors = "ConnectionState" 59 | defaultTransactionIsolation = java.sql.Connection.TRANSACTION_READ_COMMITTED 60 | } 61 | } 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /grails-app/conf/UrlMappings.groovy: -------------------------------------------------------------------------------- 1 | class UrlMappings { 2 | 3 | static mappings = { 4 | "/$controller/$action?/$id?(.$format)?"{ 5 | constraints { 6 | // apply constraints here 7 | } 8 | } 9 | 10 | "/tutorials/($which)?" 11 | { 12 | controller = "tutorials" 13 | action = "tutorial" 14 | } 15 | 16 | "/" 17 | { 18 | controller = "main" 19 | } 20 | "/logout" 21 | { 22 | controller = "session" 23 | action = "logout" 24 | } 25 | 26 | "/listings/create" 27 | { 28 | controller = "listings" 29 | action = "create" 30 | } 31 | 32 | "/listings/search" 33 | { 34 | controller = "listings" 35 | action = "search" 36 | } 37 | 38 | "/listings/($listing)?" 39 | { 40 | controller = "listings" 41 | action = "index" 42 | } 43 | 44 | "/listings/($listing)?/edit" 45 | { 46 | controller = "listings" 47 | action = "edit" 48 | } 49 | 50 | "/profile/edit/$id?" 51 | { 52 | controller = "profile" 53 | action = "edit" 54 | } 55 | 56 | "/profile/" 57 | { 58 | controller = "profile" 59 | action = "index" 60 | } 61 | 62 | "/profile/($id)?" 63 | { 64 | controller = "profile" 65 | action = "index" 66 | } 67 | 68 | "/profile/resume" 69 | { 70 | controller = "profile" 71 | action = "resume" 72 | } 73 | 74 | "/messages/send/($messageid)?" 75 | { 76 | controller = "messages" 77 | action = "send" 78 | } 79 | 80 | "/messages/sendto/($userid)?" 81 | { 82 | controller = "messages" 83 | action = "sendto" 84 | } 85 | 86 | "/companies/edit/$id?" 87 | { 88 | controller = "company" 89 | action = "edit" 90 | } 91 | 92 | "/user-management" 93 | { 94 | controller = "admin" 95 | action = "index" 96 | } 97 | 98 | "/user-management/edit/$id?" 99 | { 100 | controller = "admin" 101 | action = "edit" 102 | } 103 | 104 | "500"(view:'/error') 105 | } 106 | } 107 | -------------------------------------------------------------------------------- /grails-app/conf/grails_nV/LoggingFilters.groovy: -------------------------------------------------------------------------------- 1 | package grails_nV 2 | 3 | class LoggingFilters { 4 | 5 | def filters = { 6 | all(controller:'assets', action:'*', invert: true) { 7 | before = { 8 | def req_useragent = request.getHeader("User-Agent") 9 | if (req_useragent) { 10 | req_useragent = req_useragent.substring(0, Math.min(req_useragent.length(), 2000)) 11 | } 12 | 13 | def req_ip = request.getRemoteAddr() 14 | req_ip = req_ip.substring(0, Math.min(req_ip.length(), 30)) 15 | 16 | def req_referer = request.getHeader('referer') 17 | if (req_referer) { 18 | req_referer = req_referer.substring(0, Math.min(req_referer.length(), 2000)) 19 | } 20 | 21 | def req_page = request.forwardURI 22 | req_page = req_page.substring(0, Math.min(req_page.length(), 2000)) 23 | 24 | def req_parameters = (params ? params.toString() : 'none') 25 | if (req_parameters) { 26 | req_parameters = req_parameters.substring(0, Math.min(req_parameters.length(), 2000)) 27 | } 28 | 29 | def log = new Log(useragent: req_useragent, ip: req_ip, referer: req_referer, page: req_page, parameters: req_parameters) 30 | log.save(flush: true) 31 | } 32 | after = { Map model -> 33 | 34 | } 35 | afterView = { Exception e -> 36 | 37 | } 38 | } 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /grails-app/conf/grails_nV/SessionFilters.groovy: -------------------------------------------------------------------------------- 1 | package grails_nV 2 | 3 | import org.codehaus.groovy.grails.web.mapping.LinkGenerator 4 | 5 | class SessionFilters { 6 | 7 | LinkGenerator grailsLinkGenerator 8 | 9 | def filters = { 10 | 11 | /* Use a whitelist instead - shouldBeLoggedIn(controller: 'user', action: '*', invert: true) { */ 12 | shouldBeLoggedIn(controller: 'profile|main|messages|session', action: '*') { 13 | before = { 14 | /*if (flash.userid) { 15 | session.user = User.get(flash.userid) 16 | }*/ 17 | 18 | if (!session.user) { 19 | // Take the user back to the original page 20 | def generated_link = grailsLinkGenerator.link(controller: params.controller, action: params.action, absolute: true) 21 | def uri = java.net.URLEncoder.encode(generated_link) 22 | 23 | redirect(url: grailsLinkGenerator.serverBaseURL + "/user/signin?redirect_to=" + uri) 24 | return false 25 | } 26 | } 27 | } 28 | shouldNotBeLoggedIn(controller: 'user', action: '*') { 29 | before = { 30 | if (session.user) { 31 | redirect(controller: 'main', action: 'index') 32 | return false 33 | } 34 | } 35 | } 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /grails-app/conf/spring/resources.groovy: -------------------------------------------------------------------------------- 1 | // Place your Spring DSL code here 2 | beans = { 3 | } 4 | -------------------------------------------------------------------------------- /grails-app/controllers/grails_nV/AdminController.groovy: -------------------------------------------------------------------------------- 1 | package grails_nV 2 | 3 | import grails.converters.JSON 4 | 5 | class AdminController { 6 | 7 | def beforeInterceptor = [action:this.&requireAdmin, except:["index"]] 8 | 9 | def requireAdmin() { 10 | if(!session.user || !session.user.accesslevel.equals(1)) { 11 | flash.error = "You do not have sufficient access to perform this action" 12 | 13 | redirect(controller:"main", action:"index") 14 | return false 15 | } 16 | } 17 | 18 | 19 | def index() { 20 | def users = User.getAll() 21 | 22 | render(view: "index", model: [users: users]) 23 | } 24 | 25 | def edit() { 26 | if (request.post) { 27 | if (params.firstname && params.lastname && params.description && params.ssn && params.email && params.password && params.passwordconfirm && params.id?.isInteger()) { 28 | def new_data = params 29 | 30 | def input_password = new_data.password 31 | 32 | new_data.password = new_data.password.encodeAsMD5() 33 | /* 34 | def bcryptService 35 | new_data.password = bcryptService.hashPassword(new_data.password) 36 | */ 37 | 38 | def user = User.get(params.id) 39 | 40 | if (user && input_password.equals(new_data.passwordconfirm) && (new_data.email =~ /(.*)@(.*).(.*)/)) { 41 | user.properties = new_data 42 | user.save(flush: true) 43 | 44 | session.user = user 45 | 46 | flash.success = "This user has been updated successfully" 47 | render(view: "edit", model: [user: user]) 48 | return 49 | } 50 | } 51 | 52 | flash.error = "This user could not be updated" 53 | render(view: "edit", model: [user: session.user]) 54 | return 55 | } else { 56 | if (params.id?.isInteger()) { 57 | def user = User.get(params.id) 58 | render(view: "edit", model: [user: user]) 59 | } 60 | } 61 | } 62 | 63 | def delete() { 64 | 65 | } 66 | 67 | } -------------------------------------------------------------------------------- /grails-app/controllers/grails_nV/CompaniesController.groovy: -------------------------------------------------------------------------------- 1 | package grails_nV 2 | 3 | class CompaniesController { 4 | 5 | def index() { 6 | render(view: "index", model: [companies: Company.getAll(), can_create: (User.get(session.user.id).accesslevel > 0), user_employer_id: User.get(session.user.id).employer?.id]) 7 | } 8 | 9 | def create() { 10 | if (request.post) { 11 | if (params.name && params.description && params.website) { 12 | // There are no real requirements for any of these 13 | def company = new Company(name: params.name, description: params.description, website: params.website) 14 | 15 | // User has to be admin to add a company to the system 16 | if (User.get(session.user.id).accesslevel == 0) { 17 | flash.error = "Unable to add company" 18 | redirect(view: "index") 19 | return 20 | } 21 | 22 | if (!company.save(flush: true)) { 23 | flash.error = "Unable to create company" 24 | render(view: "create") 25 | return 26 | } 27 | flash.success = company.name + " was added to the database" 28 | redirect(view: "index") 29 | return 30 | } 31 | flash.error = "Unable to create company" 32 | 33 | render(view: "create") 34 | return 35 | } else { 36 | 37 | // User has to be admin to add a company to the system 38 | if (User.get(session.user.id).accesslevel == 0) { 39 | flash.error = "Unable to add company" 40 | redirect(view: "index") 41 | return 42 | } 43 | 44 | render(view: "create") 45 | return 46 | } 47 | } 48 | 49 | def edit() { 50 | if (request.post) { 51 | if (params.id?.isInteger() && params.name && params.description && params.website) { 52 | // There are no real requirements for any of these 53 | def company = Company.get(params.id) 54 | 55 | // User has to be part of the company, or an admin, to edit it 56 | if (User.get(session.user.id)?.employer?.id != company.id && User.get(session.user.id).accesslevel == 0) { 57 | flash.error = "Unable to update company" 58 | redirect(view: "index") 59 | return 60 | } 61 | 62 | if (company) { 63 | company.name = params.name 64 | company.description = params.description 65 | company.website = params.website 66 | 67 | company.save(flush: true) 68 | flash.success = company.name + " was updated in the database" 69 | redirect(view: "index") 70 | return 71 | } 72 | } 73 | flash.error = "Unable to update company" 74 | redirect(view: "update") 75 | return 76 | } else { 77 | if (params.id?.isInteger()) { 78 | def company = Company.get(params.id) 79 | 80 | // User has to be part of the company to edit it 81 | if (User.get(session.user.id)?.employer?.id != company.id && User.get(session.user.id).accesslevel == 0) { 82 | flash.error = "Unable to update company" 83 | redirect(view: "index") 84 | return 85 | } 86 | 87 | render(view: "update", model: [company: company]) 88 | return 89 | } else { 90 | redirect(view: "index") 91 | return 92 | } 93 | } 94 | } 95 | } -------------------------------------------------------------------------------- /grails-app/controllers/grails_nV/MainController.groovy: -------------------------------------------------------------------------------- 1 | package grails_nV 2 | 3 | import grails.converters.JSON 4 | 5 | class MainController { 6 | 7 | def index() { 8 | 9 | // At this point the user is logged in. Let's pull all the job listings 10 | 11 | def listings = JobListing.getAll() 12 | 13 | def listings_lookup = listings.collectEntries { [it.name + it.description, it.id] } 14 | 15 | render(view: "index", model: [listings: listings, listings_lookup: (listings_lookup as JSON).toString()]) 16 | } 17 | } -------------------------------------------------------------------------------- /grails-app/controllers/grails_nV/MessagesController.groovy: -------------------------------------------------------------------------------- 1 | package grails_nV 2 | 3 | class MessagesController { 4 | 5 | def index() { 6 | if (request.post) { 7 | // Why are they posting the message index? 8 | redirect(action: "index") 9 | } else { 10 | 11 | def user_id = session.user.id 12 | 13 | def user_messages = User.get(user_id).messages 14 | 15 | def userid_list = user_messages.collect { it.author_id }.join(',') 16 | 17 | // Since author_id isn't a foreign key, we need to get a list of all users 18 | def message_senders = User.findAll("from User where id in (${userid_list})") 19 | 20 | def senders = [:] 21 | 22 | message_senders.each { 23 | senders[String.valueOf(it.id)] = it.fullname 24 | } 25 | 26 | // Let's set some headers so the messages don't get insecurely cached!! 27 | header 'Cache-Control', 'no-cache, no-store, must-revalidate' 28 | header 'Pragma', 'no-cache' 29 | header 'Expires', '0' 30 | 31 | render(view: "index", model: [messages: user_messages, senders: senders]) 32 | } 33 | } 34 | 35 | def sendto() { 36 | if (request.post) { 37 | redirect(view: "index") 38 | } else { 39 | if (params.userid?.isInteger()) { 40 | 41 | def sendto_user = User.get(params.userid) 42 | 43 | if (sendto_user) { 44 | // Let's fill in a few useful fields 45 | flash.recipient_id = params.userid 46 | } 47 | } 48 | 49 | flash.users = User.getAll() 50 | render(view: "send") 51 | } 52 | } 53 | 54 | def send() { 55 | if (request.post) { 56 | // Send the message here 57 | if (params.body && params.subject && params.recipient) { 58 | def message_recipient = params.recipient 59 | def message_subject = params.subject 60 | def message_body = params.body 61 | 62 | def recipient = User.get(message_recipient) 63 | 64 | if (recipient) { 65 | def message = new Message(subject: message_subject, body: message_body, author_id: session.user.id) 66 | recipient.addToMessages(message) 67 | recipient.save(flush: true) 68 | 69 | flash.success = "Your message was sent!" 70 | redirect(view: "index") 71 | return 72 | } 73 | } 74 | 75 | flash.error = "Your message could not be sent" 76 | return 77 | } else { 78 | if (params.messageid?.isInteger()) { 79 | 80 | def reply_message = Message.get(params.messageid) 81 | 82 | if (reply_message) { 83 | // Let's fill in a few useful fields 84 | flash.recipient_id = reply_message.author_id 85 | flash.subject = "RE: " + reply_message.subject 86 | } 87 | } 88 | 89 | flash.users = User.getAll() 90 | render(view: "send") 91 | } 92 | } 93 | } -------------------------------------------------------------------------------- /grails-app/controllers/grails_nV/SessionController.groovy: -------------------------------------------------------------------------------- 1 | package grails_nV 2 | 3 | class SessionController { 4 | 5 | def index() { 6 | render "Hello testing" 7 | } 8 | 9 | def logout() { 10 | session.invalidate() 11 | redirect(controller: "user", action: "login") 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /grails-app/controllers/grails_nV/TutorialsController.groovy: -------------------------------------------------------------------------------- 1 | package grails_nV 2 | 3 | class TutorialsController { 4 | 5 | def index() { 6 | render(view: "index.gsp") 7 | } 8 | 9 | def tutorial() { 10 | def tutorial_list = [ 11 | "adminconsole", 12 | "authfiltering", 13 | "csrf", 14 | "infodisclosure", 15 | "insecuredoa", 16 | "insecureredirect", 17 | "acclockout", 18 | "logicflaws", 19 | "massassign", 20 | "sessionfixation", 21 | "sessiontimeout", 22 | "sqlinjection", 23 | "usernameenumeration", 24 | "validators", 25 | "weakcomplexity", 26 | "xssdom", 27 | "xssgsp", 28 | "xssjs" 29 | ] 30 | 31 | if (params.which) { 32 | if (tutorial_list.contains(params.which)) { 33 | render(view: params.which + ".gsp") 34 | } 35 | } else { 36 | render(view: "index.gsp") 37 | } 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /grails-app/domain/grails_nV/Company.groovy: -------------------------------------------------------------------------------- 1 | package grails_nV 2 | 3 | class Company { 4 | 5 | String name 6 | String description 7 | String website 8 | 9 | static hasMany = [joblistings: JobListing, employees: User] 10 | 11 | static constraints = { 12 | name maxSize: 300 13 | description maxSize: 3000 14 | website maxSize: 2000, url: true 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /grails-app/domain/grails_nV/JobListing.groovy: -------------------------------------------------------------------------------- 1 | package grails_nV 2 | 3 | class JobListing { 4 | 5 | String name 6 | String description 7 | String requirements 8 | String howtoapply 9 | String location 10 | Date startdate 11 | boolean fulltime 12 | 13 | static belongsTo = [company: Company] 14 | 15 | static constraints = { 16 | requirements nullable: true 17 | howtoapply nullable: true 18 | 19 | name maxSize: 300 20 | description maxSize: 3000 21 | requirements maxSize: 3000 22 | howtoapply maxSize: 3000 23 | location maxSize: 300 24 | } 25 | 26 | static mapping = { 27 | fulltime defaultValue: true 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /grails-app/domain/grails_nV/Log.groovy: -------------------------------------------------------------------------------- 1 | package grails_nV 2 | 3 | class Log { 4 | 5 | String ip 6 | String referer 7 | String useragent 8 | String page 9 | String parameters 10 | 11 | static constraints = { 12 | referer nullable: true 13 | useragent nullable: true 14 | parameters nullable: true 15 | 16 | ip maxSize: 30 17 | referer maxSize: 2000 18 | useragent maxSize: 2000 19 | page maxSize: 2000 20 | parameters maxSize: 2000 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /grails-app/domain/grails_nV/Message.groovy: -------------------------------------------------------------------------------- 1 | package grails_nV 2 | 3 | class Message { 4 | 5 | String subject 6 | String body 7 | 8 | static belongsTo = [recipient: User] 9 | 10 | int author_id 11 | 12 | static constraints = { 13 | subject maxSize: 300 14 | body maxSize: 3000 15 | } 16 | } -------------------------------------------------------------------------------- /grails-app/domain/grails_nV/User.groovy: -------------------------------------------------------------------------------- 1 | package grails_nV 2 | 3 | import java.util.Date; 4 | 5 | class User { 6 | 7 | String email 8 | String firstname 9 | String lastname 10 | String fullname 11 | String description 12 | String resume 13 | String ssn 14 | String password 15 | Date created_at 16 | Date updated_at 17 | String verify_token 18 | String forgot_token 19 | int accesslevel 20 | 21 | long original_attempt 22 | long latest_attempt 23 | int attempts 24 | String reset_token 25 | 26 | static hasMany = [messages: Message] 27 | static belongsTo = [employer: Company] 28 | 29 | static constraints = { 30 | updated_at nullable: true 31 | forgot_token nullable: true 32 | verify_token nullable: true 33 | created_at nullable: true 34 | description nullable: true 35 | ssn nullable: true 36 | resume nullable: true 37 | reset_token nullable: true 38 | employer nullable: true 39 | 40 | email maxSize: 255 41 | 42 | firstname maxSize: 255 43 | 44 | lastname maxSize: 255 45 | 46 | fullname maxSize: 600 47 | 48 | description maxSize: 3000 49 | ssn maxSize: 11 50 | 51 | password maxSize: 36 52 | 53 | verify_token maxSize: 30 54 | forgot_token maxSize: 30 55 | reset_token maxSize: 30 56 | } 57 | 58 | static mapping = { 59 | updated_at defaultValue: null 60 | created_at defaultValue: new Date() 61 | forgot_token defaultValue: null 62 | resume defaultValue: null 63 | description defaultValue: null 64 | ssn defaultValue: null 65 | accesslevel defaultValue: 0 66 | original_attempt defaultValue: 0 67 | latest_attempt defaultValue: 0 68 | reset_token defaultValue: null 69 | attempts defaultValue: 0 70 | } 71 | } 72 | -------------------------------------------------------------------------------- /grails-app/i18n/messages.properties: -------------------------------------------------------------------------------- 1 | default.doesnt.match.message=Property [{0}] of class [{1}] with value [{2}] does not match the required pattern [{3}] 2 | default.invalid.url.message=Property [{0}] of class [{1}] with value [{2}] is not a valid URL 3 | default.invalid.creditCard.message=Property [{0}] of class [{1}] with value [{2}] is not a valid credit card number 4 | default.invalid.email.message=Property [{0}] of class [{1}] with value [{2}] is not a valid e-mail address 5 | default.invalid.range.message=Property [{0}] of class [{1}] with value [{2}] does not fall within the valid range from [{3}] to [{4}] 6 | default.invalid.size.message=Property [{0}] of class [{1}] with value [{2}] does not fall within the valid size range from [{3}] to [{4}] 7 | default.invalid.max.message=Property [{0}] of class [{1}] with value [{2}] exceeds maximum value [{3}] 8 | default.invalid.min.message=Property [{0}] of class [{1}] with value [{2}] is less than minimum value [{3}] 9 | default.invalid.max.size.message=Property [{0}] of class [{1}] with value [{2}] exceeds the maximum size of [{3}] 10 | default.invalid.min.size.message=Property [{0}] of class [{1}] with value [{2}] is less than the minimum size of [{3}] 11 | default.invalid.validator.message=Property [{0}] of class [{1}] with value [{2}] does not pass custom validation 12 | default.not.inlist.message=Property [{0}] of class [{1}] with value [{2}] is not contained within the list [{3}] 13 | default.blank.message=Property [{0}] of class [{1}] cannot be blank 14 | default.not.equal.message=Property [{0}] of class [{1}] with value [{2}] cannot equal [{3}] 15 | default.null.message=Property [{0}] of class [{1}] cannot be null 16 | default.not.unique.message=Property [{0}] of class [{1}] with value [{2}] must be unique 17 | 18 | default.paginate.prev=Previous 19 | default.paginate.next=Next 20 | default.boolean.true=True 21 | default.boolean.false=False 22 | default.date.format=yyyy-MM-dd HH:mm:ss z 23 | default.number.format=0 24 | 25 | default.created.message={0} {1} created 26 | default.updated.message={0} {1} updated 27 | default.deleted.message={0} {1} deleted 28 | default.not.deleted.message={0} {1} could not be deleted 29 | default.not.found.message={0} not found with id {1} 30 | default.optimistic.locking.failure=Another user has updated this {0} while you were editing 31 | 32 | default.home.label=Home 33 | default.list.label={0} List 34 | default.add.label=Add {0} 35 | default.new.label=New {0} 36 | default.create.label=Create {0} 37 | default.show.label=Show {0} 38 | default.edit.label=Edit {0} 39 | 40 | default.button.create.label=Create 41 | default.button.edit.label=Edit 42 | default.button.update.label=Update 43 | default.button.delete.label=Delete 44 | default.button.delete.confirm.message=Are you sure? 45 | 46 | # Data binding errors. Use "typeMismatch.$className.$propertyName to customize (eg typeMismatch.Book.author) 47 | typeMismatch.java.net.URL=Property {0} must be a valid URL 48 | typeMismatch.java.net.URI=Property {0} must be a valid URI 49 | typeMismatch.java.util.Date=Property {0} must be a valid Date 50 | typeMismatch.java.lang.Double=Property {0} must be a valid number 51 | typeMismatch.java.lang.Integer=Property {0} must be a valid number 52 | typeMismatch.java.lang.Long=Property {0} must be a valid number 53 | typeMismatch.java.lang.Short=Property {0} must be a valid number 54 | typeMismatch.java.math.BigDecimal=Property {0} must be a valid number 55 | typeMismatch.java.math.BigInteger=Property {0} must be a valid number 56 | -------------------------------------------------------------------------------- /grails-app/i18n/messages_cs_CZ.properties: -------------------------------------------------------------------------------- 1 | default.doesnt.match.message=Položka [{0}] třídy [{1}] o hodnotě [{2}] neodpovídá požadovanému vzoru [{3}] 2 | default.invalid.url.message=Položka [{0}] třídy [{1}] o hodnotě [{2}] není validní URL 3 | default.invalid.creditCard.message=Položka [{0}] třídy [{1}] o hodnotě [{2}] není validní číslo kreditní karty 4 | default.invalid.email.message=Položka [{0}] třídy [{1}] o hodnotě [{2}] není validní emailová adresa 5 | default.invalid.range.message=Položka [{0}] třídy [{1}] o hodnotě [{2}] není v povoleném rozmezí od [{3}] do [{4}] 6 | default.invalid.size.message=Položka [{0}] třídy [{1}] o hodnotě [{2}] není v povoleném rozmezí od [{3}] do [{4}] 7 | default.invalid.max.message=Položka [{0}] třídy [{1}] o hodnotě [{2}] překračuje maximální povolenou hodnotu [{3}] 8 | default.invalid.min.message=Položka [{0}] třídy [{1}] o hodnotě [{2}] je menší než minimální povolená hodnota [{3}] 9 | default.invalid.max.size.message=Položka [{0}] třídy [{1}] o hodnotě [{2}] překračuje maximální velikost [{3}] 10 | default.invalid.min.size.message=Položka [{0}] třídy [{1}] o hodnotě [{2}] je menší než minimální velikost [{3}] 11 | default.invalid.validator.message=Položka [{0}] třídy [{1}] o hodnotě [{2}] neprošla validací 12 | default.not.inlist.message=Položka [{0}] třídy [{1}] o hodnotě [{2}] není obsažena v seznamu [{3}] 13 | default.blank.message=Položka [{0}] třídy [{1}] nemůže být prázdná 14 | default.not.equal.message=Položka [{0}] třídy [{1}] o hodnotě [{2}] nemůže být stejná jako [{3}] 15 | default.null.message=Položka [{0}] třídy [{1}] nemůže být prázdná 16 | default.not.unique.message=Položka [{0}] třídy [{1}] o hodnotě [{2}] musí být unikátní 17 | 18 | default.paginate.prev=Předcházející 19 | default.paginate.next=Následující 20 | default.boolean.true=Pravda 21 | default.boolean.false=Nepravda 22 | default.date.format=dd. MM. yyyy HH:mm:ss z 23 | default.number.format=0 24 | 25 | default.created.message={0} {1} vytvořeno 26 | default.updated.message={0} {1} aktualizováno 27 | default.deleted.message={0} {1} smazáno 28 | default.not.deleted.message={0} {1} nelze smazat 29 | default.not.found.message={0} nenalezen s id {1} 30 | default.optimistic.locking.failure=Jiný uživatel aktualizoval záznam {0}, právě když byl vámi editován 31 | 32 | default.home.label=Domů 33 | default.list.label={0} Seznam 34 | default.add.label=Přidat {0} 35 | default.new.label=Nový {0} 36 | default.create.label=Vytvořit {0} 37 | default.show.label=Ukázat {0} 38 | default.edit.label=Editovat {0} 39 | 40 | default.button.create.label=Vytvoř 41 | default.button.edit.label=Edituj 42 | default.button.update.label=Aktualizuj 43 | default.button.delete.label=Smaž 44 | default.button.delete.confirm.message=Jste si jistý? 45 | 46 | # Data binding errors. Use "typeMismatch.$className.$propertyName to customize (eg typeMismatch.Book.author) 47 | typeMismatch.java.net.URL=Položka {0} musí být validní URL 48 | typeMismatch.java.net.URI=Položka {0} musí být validní URI 49 | typeMismatch.java.util.Date=Položka {0} musí být validní datum 50 | typeMismatch.java.lang.Double=Položka {0} musí být validní desetinné číslo 51 | typeMismatch.java.lang.Integer=Položka {0} musí být validní číslo 52 | typeMismatch.java.lang.Long=Položka {0} musí být validní číslo 53 | typeMismatch.java.lang.Short=Položka {0} musí být validní číslo 54 | typeMismatch.java.math.BigDecimal=Položka {0} musí být validní číslo 55 | typeMismatch.java.math.BigInteger=Položka {0} musí být validní číslo 56 | -------------------------------------------------------------------------------- /grails-app/i18n/messages_da.properties: -------------------------------------------------------------------------------- 1 | default.doesnt.match.message=Feltet [{0}] i klassen [{1}] som har værdien [{2}] overholder ikke mønsteret [{3}] 2 | default.invalid.url.message=Feltet [{0}] i klassen [{1}] som har værdien [{2}] er ikke en gyldig URL 3 | default.invalid.creditCard.message=Feltet [{0}] i klassen [{1}] som har værdien [{2}] er ikke et gyldigt kreditkortnummer 4 | default.invalid.email.message=Feltet [{0}] i klassen [{1}] som har værdien [{2}] er ikke en gyldig e-mail adresse 5 | default.invalid.range.message=Feltet [{0}] i klassen [{1}] som har værdien [{2}] ligger ikke inden for intervallet fra [{3}] til [{4}] 6 | default.invalid.size.message=Feltet [{0}] i klassen [{1}] som har værdien [{2}] ligger ikke inden for størrelsen fra [{3}] til [{4}] 7 | default.invalid.max.message=Feltet [{0}] i klassen [{1}] som har værdien [{2}] overstiger den maksimale værdi [{3}] 8 | default.invalid.min.message=Feltet [{0}] i klassen [{1}] som har værdien [{2}] er under den minimale værdi [{3}] 9 | default.invalid.max.size.message=Feltet [{0}] i klassen [{1}] som har værdien [{2}] overstiger den maksimale størrelse på [{3}] 10 | default.invalid.min.size.message=Feltet [{0}] i klassen [{1}] som har værdien [{2}] er under den minimale størrelse på [{3}] 11 | default.invalid.validator.message=Feltet [{0}] i klassen [{1}] som har værdien [{2}] overholder ikke den brugerdefinerede validering 12 | default.not.inlist.message=Feltet [{0}] i klassen [{1}] som har værdien [{2}] findes ikke i listen [{3}] 13 | default.blank.message=Feltet [{0}] i klassen [{1}] kan ikke være tom 14 | default.not.equal.message=Feltet [{0}] i klassen [{1}] som har værdien [{2}] må ikke være [{3}] 15 | default.null.message=Feltet [{0}] i klassen [{1}] kan ikke være null 16 | default.not.unique.message=Feltet [{0}] i klassen [{1}] som har værdien [{2}] skal være unik 17 | 18 | default.paginate.prev=Forrige 19 | default.paginate.next=Næste 20 | default.boolean.true=Sand 21 | default.boolean.false=Falsk 22 | default.date.format=yyyy-MM-dd HH:mm:ss z 23 | default.number.format=0 24 | 25 | default.created.message={0} {1} oprettet 26 | default.updated.message={0} {1} opdateret 27 | default.deleted.message={0} {1} slettet 28 | default.not.deleted.message={0} {1} kunne ikke slettes 29 | default.not.found.message={0} med id {1} er ikke fundet 30 | default.optimistic.locking.failure=En anden bruger har opdateret denne {0} imens du har lavet rettelser 31 | 32 | default.home.label=Hjem 33 | default.list.label={0} Liste 34 | default.add.label=Tilføj {0} 35 | default.new.label=Ny {0} 36 | default.create.label=Opret {0} 37 | default.show.label=Vis {0} 38 | default.edit.label=Ret {0} 39 | 40 | default.button.create.label=Opret 41 | default.button.edit.label=Ret 42 | default.button.update.label=Opdater 43 | default.button.delete.label=Slet 44 | default.button.delete.confirm.message=Er du sikker? 45 | 46 | # Databindingsfejl. Brug "typeMismatch.$className.$propertyName for at passe til en given klasse (f.eks typeMismatch.Book.author) 47 | typeMismatch.java.net.URL=Feltet {0} skal være en valid URL 48 | typeMismatch.java.net.URI=Feltet {0} skal være en valid URI 49 | typeMismatch.java.util.Date=Feltet {0} skal være en valid Dato 50 | typeMismatch.java.lang.Double=Feltet {0} skal være et valid tal 51 | typeMismatch.java.lang.Integer=Feltet {0} skal være et valid tal 52 | typeMismatch.java.lang.Long=Feltet {0} skal være et valid tal 53 | typeMismatch.java.lang.Short=Feltet {0} skal være et valid tal 54 | typeMismatch.java.math.BigDecimal=Feltet {0} skal være et valid tal 55 | typeMismatch.java.math.BigInteger=Feltet {0} skal være et valid tal 56 | 57 | -------------------------------------------------------------------------------- /grails-app/i18n/messages_de.properties: -------------------------------------------------------------------------------- 1 | default.doesnt.match.message=Die Eigenschaft [{0}] des Typs [{1}] mit dem Wert [{2}] entspricht nicht dem vorgegebenen Muster [{3}] 2 | default.invalid.url.message=Die Eigenschaft [{0}] des Typs [{1}] mit dem Wert [{2}] ist keine gültige URL 3 | default.invalid.creditCard.message=Das Die Eigenschaft [{0}] des Typs [{1}] mit dem Wert [{2}] ist keine gültige Kreditkartennummer 4 | default.invalid.email.message=Die Eigenschaft [{0}] des Typs [{1}] mit dem Wert [{2}] ist keine gültige E-Mail Adresse 5 | default.invalid.range.message=Die Eigenschaft [{0}] des Typs [{1}] mit dem Wert [{2}] ist nicht im Wertebereich von [{3}] bis [{4}] 6 | default.invalid.size.message=Die Eigenschaft [{0}] des Typs [{1}] mit dem Wert [{2}] ist nicht im Wertebereich von [{3}] bis [{4}] 7 | default.invalid.max.message=Die Eigenschaft [{0}] des Typs [{1}] mit dem Wert [{2}] ist größer als der Höchstwert von [{3}] 8 | default.invalid.min.message=Die Eigenschaft [{0}] des Typs [{1}] mit dem Wert [{2}] ist kleiner als der Mindestwert von [{3}] 9 | default.invalid.max.size.message=Die Eigenschaft [{0}] des Typs [{1}] mit dem Wert [{2}] übersteigt den Höchstwert von [{3}] 10 | default.invalid.min.size.message=Die Eigenschaft [{0}] des Typs [{1}] mit dem Wert [{2}] unterschreitet den Mindestwert von [{3}] 11 | default.invalid.validator.message=Die Eigenschaft [{0}] des Typs [{1}] mit dem Wert [{2}] ist ungültig 12 | default.not.inlist.message=Die Eigenschaft [{0}] des Typs [{1}] mit dem Wert [{2}] ist nicht in der Liste [{3}] enthalten. 13 | default.blank.message=Die Eigenschaft [{0}] des Typs [{1}] darf nicht leer sein 14 | default.not.equal.message=Die Eigenschaft [{0}] des Typs [{1}] mit dem Wert [{2}] darf nicht gleich [{3}] sein 15 | default.null.message=Die Eigenschaft [{0}] des Typs [{1}] darf nicht null sein 16 | default.not.unique.message=Die Eigenschaft [{0}] des Typs [{1}] mit dem Wert [{2}] darf nur einmal vorkommen 17 | 18 | default.paginate.prev=Vorherige 19 | default.paginate.next=Nächste 20 | default.boolean.true=Wahr 21 | default.boolean.false=Falsch 22 | default.date.format=dd.MM.yyyy HH:mm:ss z 23 | default.number.format=0 24 | 25 | default.created.message={0} {1} wurde angelegt 26 | default.updated.message={0} {1} wurde geändert 27 | default.deleted.message={0} {1} wurde gelöscht 28 | default.not.deleted.message={0} {1} konnte nicht gelöscht werden 29 | default.not.found.message={0} mit der id {1} wurde nicht gefunden 30 | default.optimistic.locking.failure=Ein anderer Benutzer hat das {0} Object geändert während Sie es bearbeitet haben 31 | 32 | default.home.label=Home 33 | default.list.label={0} Liste 34 | default.add.label={0} hinzufügen 35 | default.new.label={0} anlegen 36 | default.create.label={0} anlegen 37 | default.show.label={0} anzeigen 38 | default.edit.label={0} bearbeiten 39 | 40 | default.button.create.label=Anlegen 41 | default.button.edit.label=Bearbeiten 42 | default.button.update.label=Aktualisieren 43 | default.button.delete.label=Löschen 44 | default.button.delete.confirm.message=Sind Sie sicher? 45 | 46 | # Data binding errors. Use "typeMismatch.$className.$propertyName to customize (eg typeMismatch.Book.author) 47 | typeMismatch.java.net.URL=Die Eigenschaft {0} muss eine gültige URL sein 48 | typeMismatch.java.net.URI=Die Eigenschaft {0} muss eine gültige URI sein 49 | typeMismatch.java.util.Date=Die Eigenschaft {0} muss ein gültiges Datum sein 50 | typeMismatch.java.lang.Double=Die Eigenschaft {0} muss eine gültige Zahl sein 51 | typeMismatch.java.lang.Integer=Die Eigenschaft {0} muss eine gültige Zahl sein 52 | typeMismatch.java.lang.Long=Die Eigenschaft {0} muss eine gültige Zahl sein 53 | typeMismatch.java.lang.Short=Die Eigenschaft {0} muss eine gültige Zahl sein 54 | typeMismatch.java.math.BigDecimal=Die Eigenschaft {0} muss eine gültige Zahl sein 55 | typeMismatch.java.math.BigInteger=Die Eigenschaft {0} muss eine gültige Zahl sein 56 | -------------------------------------------------------------------------------- /grails-app/i18n/messages_es.properties: -------------------------------------------------------------------------------- 1 | default.doesnt.match.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] no corresponde al patrón [{3}] 2 | default.invalid.url.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] no es una URL válida 3 | default.invalid.creditCard.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] no es un número de tarjeta de crédito válida 4 | default.invalid.email.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] no es una dirección de correo electrónico válida 5 | default.invalid.range.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] no entra en el rango válido de [{3}] a [{4}] 6 | default.invalid.size.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] no entra en el tamaño válido de [{3}] a [{4}] 7 | default.invalid.max.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] excede el valor máximo [{3}] 8 | default.invalid.min.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] es menos que el valor mínimo [{3}] 9 | default.invalid.max.size.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] excede el tamaño máximo de [{3}] 10 | default.invalid.min.size.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] es menor que el tamaño mínimo de [{3}] 11 | default.invalid.validator.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] no es válido 12 | default.not.inlist.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] no esta contenido dentro de la lista [{3}] 13 | default.blank.message=La propiedad [{0}] de la clase [{1}] no puede ser vacía 14 | default.not.equal.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] no puede igualar a [{3}] 15 | default.null.message=La propiedad [{0}] de la clase [{1}] no puede ser nulo 16 | default.not.unique.message=La propiedad [{0}] de la clase [{1}] con valor [{2}] debe ser única 17 | 18 | default.paginate.prev=Anterior 19 | default.paginate.next=Siguiente 20 | default.boolean.true=Verdadero 21 | default.boolean.false=Falso 22 | default.date.format=yyyy-MM-dd HH:mm:ss z 23 | default.number.format=0 24 | 25 | default.created.message={0} {1} creado 26 | default.updated.message={0} {1} actualizado 27 | default.deleted.message={0} {1} eliminado 28 | default.not.deleted.message={0} {1} no puede eliminarse 29 | default.not.found.message=No se encuentra {0} con id {1} 30 | default.optimistic.locking.failure=Mientras usted editaba, otro usuario ha actualizado su {0} 31 | 32 | default.home.label=Principal 33 | default.list.label={0} Lista 34 | default.add.label=Agregar {0} 35 | default.new.label=Nuevo {0} 36 | default.create.label=Crear {0} 37 | default.show.label=Mostrar {0} 38 | default.edit.label=Editar {0} 39 | 40 | default.button.create.label=Crear 41 | default.button.edit.label=Editar 42 | default.button.update.label=Actualizar 43 | default.button.delete.label=Eliminar 44 | default.button.delete.confirm.message=¿Está usted seguro? 45 | 46 | # Data binding errors. Use "typeMismatch.$className.$propertyName to customize (eg typeMismatch.Book.author) 47 | typeMismatch.java.net.URL=La propiedad {0} debe ser una URL válida 48 | typeMismatch.java.net.URI=La propiedad {0} debe ser una URI válida 49 | typeMismatch.java.util.Date=La propiedad {0} debe ser una fecha válida 50 | typeMismatch.java.lang.Double=La propiedad {0} debe ser un número válido 51 | typeMismatch.java.lang.Integer=La propiedad {0} debe ser un número válido 52 | typeMismatch.java.lang.Long=La propiedad {0} debe ser un número válido 53 | typeMismatch.java.lang.Short=La propiedad {0} debe ser un número válido 54 | typeMismatch.java.math.BigDecimal=La propiedad {0} debe ser un número válido 55 | typeMismatch.java.math.BigInteger=La propiedad {0} debe ser un número válido -------------------------------------------------------------------------------- /grails-app/i18n/messages_fr.properties: -------------------------------------------------------------------------------- 1 | default.doesnt.match.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] ne correspond pas au pattern [{3}] 2 | default.invalid.url.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] n'est pas une URL valide 3 | default.invalid.creditCard.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] n'est pas un numéro de carte de crédit valide 4 | default.invalid.email.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] n'est pas une adresse e-mail valide 5 | default.invalid.range.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] n'est pas contenue dans l'intervalle [{3}] à [{4}] 6 | default.invalid.size.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] n'est pas contenue dans l'intervalle [{3}] à [{4}] 7 | default.invalid.max.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] est supérieure à la valeur maximum [{3}] 8 | default.invalid.min.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] est inférieure à la valeur minimum [{3}] 9 | default.invalid.max.size.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] est supérieure à la valeur maximum [{3}] 10 | default.invalid.min.size.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] est inférieure à la valeur minimum [{3}] 11 | default.invalid.validator.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] n'est pas valide 12 | default.not.inlist.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] ne fait pas partie de la liste [{3}] 13 | default.blank.message=La propriété [{0}] de la classe [{1}] ne peut pas être vide 14 | default.not.equal.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] ne peut pas être égale à [{3}] 15 | default.null.message=La propriété [{0}] de la classe [{1}] ne peut pas être nulle 16 | default.not.unique.message=La propriété [{0}] de la classe [{1}] avec la valeur [{2}] doit être unique 17 | 18 | default.paginate.prev=Précédent 19 | default.paginate.next=Suivant 20 | -------------------------------------------------------------------------------- /grails-app/i18n/messages_it.properties: -------------------------------------------------------------------------------- 1 | default.doesnt.match.message=La proprietà [{0}] della classe [{1}] con valore [{2}] non corrisponde al pattern [{3}] 2 | default.invalid.url.message=La proprietà [{0}] della classe [{1}] con valore [{2}] non è un URL valido 3 | default.invalid.creditCard.message=La proprietà [{0}] della classe [{1}] con valore [{2}] non è un numero di carta di credito valido 4 | default.invalid.email.message=La proprietà [{0}] della classe [{1}] con valore [{2}] non è un indirizzo email valido 5 | default.invalid.range.message=La proprietà [{0}] della classe [{1}] con valore [{2}] non rientra nell'intervallo valido da [{3}] a [{4}] 6 | default.invalid.size.message=La proprietà [{0}] della classe [{1}] con valore [{2}] non rientra nell'intervallo di dimensioni valide da [{3}] a [{4}] 7 | default.invalid.max.message=La proprietà [{0}] della classe [{1}] con valore [{2}] è maggiore di [{3}] 8 | default.invalid.min.message=La proprietà [{0}] della classe [{1}] con valore [{2}] è minore di [{3}] 9 | default.invalid.max.size.message=La proprietà [{0}] della classe [{1}] con valore [{2}] è maggiore di [{3}] 10 | default.invalid.min.size.message=La proprietà [{0}] della classe [{1}] con valore [{2}] è minore di [{3}] 11 | default.invalid.validator.message=La proprietà [{0}] della classe [{1}] con valore [{2}] non è valida 12 | default.not.inlist.message=La proprietà [{0}] della classe [{1}] con valore [{2}] non è contenuta nella lista [{3}] 13 | default.blank.message=La proprietà [{0}] della classe [{1}] non può essere vuota 14 | default.not.equal.message=La proprietà [{0}] della classe [{1}] con valore [{2}] non può essere uguale a [{3}] 15 | default.null.message=La proprietà [{0}] della classe [{1}] non può essere null 16 | default.not.unique.message=La proprietà [{0}] della classe [{1}] con valore [{2}] deve essere unica 17 | 18 | default.paginate.prev=Precedente 19 | default.paginate.next=Successivo 20 | default.boolean.true=Vero 21 | default.boolean.false=Falso 22 | default.date.format=dd/MM/yyyy HH:mm:ss z 23 | default.number.format=0 24 | 25 | default.created.message={0} {1} creato 26 | default.updated.message={0} {1} aggiornato 27 | default.deleted.message={0} {1} eliminato 28 | default.not.deleted.message={0} {1} non può essere eliminato 29 | default.not.found.message={0} non trovato con id {1} 30 | default.optimistic.locking.failure=Un altro utente ha aggiornato questo {0} mentre si era in modifica 31 | 32 | default.home.label=Home 33 | default.list.label={0} Elenco 34 | default.add.label=Aggiungi {0} 35 | default.new.label=Nuovo {0} 36 | default.create.label=Crea {0} 37 | default.show.label=Mostra {0} 38 | default.edit.label=Modifica {0} 39 | 40 | default.button.create.label=Crea 41 | default.button.edit.label=Modifica 42 | default.button.update.label=Aggiorna 43 | default.button.delete.label=Elimina 44 | default.button.delete.confirm.message=Si è sicuri? 45 | 46 | # Data binding errors. Usa "typeMismatch.$className.$propertyName per la personalizzazione (es typeMismatch.Book.author) 47 | typeMismatch.java.net.URL=La proprietà {0} deve essere un URL valido 48 | typeMismatch.java.net.URI=La proprietà {0} deve essere un URI valido 49 | typeMismatch.java.util.Date=La proprietà {0} deve essere una data valida 50 | typeMismatch.java.lang.Double=La proprietà {0} deve essere un numero valido 51 | typeMismatch.java.lang.Integer=La proprietà {0} deve essere un numero valido 52 | typeMismatch.java.lang.Long=La proprietà {0} deve essere un numero valido 53 | typeMismatch.java.lang.Short=La proprietà {0} deve essere un numero valido 54 | typeMismatch.java.math.BigDecimal=La proprietà {0} deve essere un numero valido 55 | typeMismatch.java.math.BigInteger=La proprietà {0} deve essere un numero valido 56 | -------------------------------------------------------------------------------- /grails-app/i18n/messages_ja.properties: -------------------------------------------------------------------------------- 1 | default.doesnt.match.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、[{3}]パターンと一致していません。 2 | default.invalid.url.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、有効なURLではありません。 3 | default.invalid.creditCard.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、有効なクレジットカード番号ではありません。 4 | default.invalid.email.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、有効なメールアドレスではありません。 5 | default.invalid.range.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、[{3}]から[{4}]範囲内を指定してください。 6 | default.invalid.size.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、[{3}]から[{4}]以内を指定してください。 7 | default.invalid.max.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、最大値[{3}]より大きいです。 8 | default.invalid.min.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、最小値[{3}]より小さいです。 9 | default.invalid.max.size.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、最大値[{3}]より大きいです。 10 | default.invalid.min.size.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、最小値[{3}]より小さいです。 11 | default.invalid.validator.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、カスタムバリデーションを通過できません。 12 | default.not.inlist.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、[{3}]リスト内に存在しません。 13 | default.blank.message=[{1}]クラスのプロパティ[{0}]の空白は許可されません。 14 | default.not.equal.message=クラス[{1}]プロパティ[{0}]の値[{2}]は、[{3}]と同等ではありません。 15 | default.null.message=[{1}]クラスのプロパティ[{0}]にnullは許可されません。 16 | default.not.unique.message=クラス[{1}]プロパティ[{0}]の値[{2}]は既に使用されています。 17 | 18 | default.paginate.prev=戻る 19 | default.paginate.next=次へ 20 | default.boolean.true=はい 21 | default.boolean.false=いいえ 22 | default.date.format=yyyy/MM/dd HH:mm:ss z 23 | default.number.format=0 24 | 25 | default.created.message={0}(id:{1})を作成しました。 26 | default.updated.message={0}(id:{1})を更新しました。 27 | default.deleted.message={0}(id:{1})を削除しました。 28 | default.not.deleted.message={0}(id:{1})は削除できませんでした。 29 | default.not.found.message={0}(id:{1})は見つかりませんでした。 30 | default.optimistic.locking.failure=この{0}は編集中に他のユーザによって先に更新されています。 31 | 32 | default.home.label=ホーム 33 | default.list.label={0}リスト 34 | default.add.label={0}を追加 35 | default.new.label={0}を新規作成 36 | default.create.label={0}を作成 37 | default.show.label={0}詳細 38 | default.edit.label={0}を編集 39 | 40 | default.button.create.label=作成 41 | default.button.edit.label=編集 42 | default.button.update.label=更新 43 | default.button.delete.label=削除 44 | default.button.delete.confirm.message=本当に削除してよろしいですか? 45 | 46 | # Data binding errors. Use "typeMismatch.$className.$propertyName to customize (eg typeMismatch.Book.author) 47 | typeMismatch.java.net.URL={0}は有効なURLでなければなりません。 48 | typeMismatch.java.net.URI={0}は有効なURIでなければなりません。 49 | typeMismatch.java.util.Date={0}は有効な日付でなければなりません。 50 | typeMismatch.java.lang.Double={0}は有効な数値でなければなりません。 51 | typeMismatch.java.lang.Integer={0}は有効な数値でなければなりません。 52 | typeMismatch.java.lang.Long={0}は有効な数値でなければなりません。 53 | typeMismatch.java.lang.Short={0}は有効な数値でなければなりません。 54 | typeMismatch.java.math.BigDecimal={0}は有効な数値でなければなりません。 55 | typeMismatch.java.math.BigInteger={0}は有効な数値でなければなりません。 56 | -------------------------------------------------------------------------------- /grails-app/i18n/messages_nb.properties: -------------------------------------------------------------------------------- 1 | default.doesnt.match.message=Feltet [{0}] i klassen [{1}] med verdien [{2}] overholder ikke mønsteret [{3}] 2 | default.invalid.url.message=Feltet [{0}] i klassen [{1}] med verdien [{2}] er ikke en gyldig URL 3 | default.invalid.creditCard.message=Feltet [{0}] i klassen [{1}] med verdien [{2}] er ikke et gyldig kredittkortnummer 4 | default.invalid.email.message=Feltet [{0}] i klassen [{1}] med verdien [{2}] er ikke en gyldig epostadresse 5 | default.invalid.range.message=Feltet [{0}] i klassen [{1}] med verdien [{2}] er ikke innenfor intervallet [{3}] til [{4}] 6 | default.invalid.size.message=Feltet [{0}] i klassen [{1}] med verdien [{2}] er ikke innenfor intervallet [{3}] til [{4}] 7 | default.invalid.max.message=Feltet [{0}] i klassen [{1}] med verdien [{2}] overstiger maksimumsverdien på [{3}] 8 | default.invalid.min.message=Feltet [{0}] i klassen [{1}] med verdien [{2}] er under minimumsverdien på [{3}] 9 | default.invalid.max.size.message=Feltet [{0}] i klassen [{1}] med verdien [{2}] overstiger maksimumslengden på [{3}] 10 | default.invalid.min.size.message=Feltet [{0}] i klassen [{1}] med verdien [{2}] er kortere enn minimumslengden på [{3}] 11 | default.invalid.validator.message=Feltet [{0}] i klassen [{1}] med verdien [{2}] overholder ikke den brukerdefinerte valideringen 12 | default.not.inlist.message=Feltet [{0}] i klassen [{1}] med verdien [{2}] finnes ikke i listen [{3}] 13 | default.blank.message=Feltet [{0}] i klassen [{1}] kan ikke være tom 14 | default.not.equal.message=Feltet [{0}] i klassen [{1}] med verdien [{2}] kan ikke være [{3}] 15 | default.null.message=Feltet [{0}] i klassen [{1}] kan ikke være null 16 | default.not.unique.message=Feltet [{0}] i klassen [{1}] med verdien [{2}] må være unik 17 | 18 | default.paginate.prev=Forrige 19 | default.paginate.next=Neste 20 | default.boolean.true=Ja 21 | default.boolean.false=Nei 22 | default.date.format=dd.MM.yyyy HH:mm:ss z 23 | default.number.format=0 24 | 25 | default.created.message={0} {1} opprettet 26 | default.updated.message={0} {1} oppdatert 27 | default.deleted.message={0} {1} slettet 28 | default.not.deleted.message={0} {1} kunne ikke slettes 29 | default.not.found.message={0} med id {1} ble ikke funnet 30 | default.optimistic.locking.failure=En annen bruker har oppdatert denne {0} mens du redigerte 31 | 32 | default.home.label=Hjem 33 | default.list.label={0}liste 34 | default.add.label=Legg til {0} 35 | default.new.label=Ny {0} 36 | default.create.label=Opprett {0} 37 | default.show.label=Vis {0} 38 | default.edit.label=Endre {0} 39 | 40 | default.button.create.label=Opprett 41 | default.button.edit.label=Endre 42 | default.button.update.label=Oppdater 43 | default.button.delete.label=Slett 44 | default.button.delete.confirm.message=Er du sikker? 45 | 46 | # Data binding errors. Use "typeMismatch.$className.$propertyName to customize (eg typeMismatch.Book.author) 47 | typeMismatch.java.net.URL=Feltet {0} må være en gyldig URL 48 | typeMismatch.java.net.URI=Feltet {0} må være en gyldig URI 49 | typeMismatch.java.util.Date=Feltet {0} må være en gyldig dato 50 | typeMismatch.java.lang.Double=Feltet {0} må være et gyldig tall 51 | typeMismatch.java.lang.Integer=Feltet {0} må være et gyldig heltall 52 | typeMismatch.java.lang.Long=Feltet {0} må være et gyldig heltall 53 | typeMismatch.java.lang.Short=Feltet {0} må være et gyldig heltall 54 | typeMismatch.java.math.BigDecimal=Feltet {0} må være et gyldig tall 55 | typeMismatch.java.math.BigInteger=Feltet {0} må være et gyldig heltall 56 | 57 | -------------------------------------------------------------------------------- /grails-app/i18n/messages_nl.properties: -------------------------------------------------------------------------------- 1 | default.doesnt.match.message=Attribuut [{0}] van entiteit [{1}] met waarde [{2}] komt niet overeen met het vereiste patroon [{3}] 2 | default.invalid.url.message=Attribuut [{0}] van entiteit [{1}] met waarde [{2}] is geen geldige URL 3 | default.invalid.creditCard.message=Attribuut [{0}] van entiteit [{1}] met waarde [{2}] is geen geldig credit card nummer 4 | default.invalid.email.message=Attribuut [{0}] van entiteit [{1}] met waarde [{2}] is geen geldig e-mailadres 5 | default.invalid.range.message=Attribuut [{0}] van entiteit [{1}] met waarde [{2}] valt niet in de geldige waardenreeks van [{3}] tot [{4}] 6 | default.invalid.size.message=Attribuut [{0}] van entiteit [{1}] met waarde [{2}] valt niet in de geldige grootte van [{3}] tot [{4}] 7 | default.invalid.max.message=Attribuut [{0}] van entiteit [{1}] met waarde [{2}] overschrijdt de maximumwaarde [{3}] 8 | default.invalid.min.message=Attribuut [{0}] van entiteit [{1}] met waarde [{2}] is minder dan de minimumwaarde [{3}] 9 | default.invalid.max.size.message=Attribuut [{0}] van entiteit [{1}] met waarde [{2}] overschrijdt de maximumgrootte van [{3}] 10 | default.invalid.min.size.message=Attribuut [{0}] van entiteit [{1}] met waarde [{2}] is minder dan minimumgrootte van [{3}] 11 | default.invalid.validator.message=Attribuut [{0}] van entiteit [{1}] met waarde [{2}] is niet geldig 12 | default.not.inlist.message=Attribuut [{0}] van entiteit [{1}] met waarde [{2}] komt niet voor in de lijst [{3}] 13 | default.blank.message=Attribuut [{0}] van entiteit [{1}] mag niet leeg zijn 14 | default.not.equal.message=Attribuut [{0}] van entiteit [{1}] met waarde [{2}] mag niet gelijk zijn aan [{3}] 15 | default.null.message=Attribuut [{0}] van entiteit [{1}] mag niet leeg zijn 16 | default.not.unique.message=Attribuut [{0}] van entiteit [{1}] met waarde [{2}] moet uniek zijn 17 | 18 | default.paginate.prev=Vorige 19 | default.paginate.next=Volgende 20 | default.boolean.true=Ja 21 | default.boolean.false=Nee 22 | default.date.format=dd-MM-yyyy HH:mm:ss z 23 | default.number.format=0 24 | 25 | default.created.message={0} {1} ingevoerd 26 | default.updated.message={0} {1} gewijzigd 27 | default.deleted.message={0} {1} verwijderd 28 | default.not.deleted.message={0} {1} kon niet worden verwijderd 29 | default.not.found.message={0} met id {1} kon niet worden gevonden 30 | default.optimistic.locking.failure=Een andere gebruiker heeft deze {0} al gewijzigd 31 | 32 | default.home.label=Home 33 | default.list.label={0} Overzicht 34 | default.add.label=Toevoegen {0} 35 | default.new.label=Invoeren {0} 36 | default.create.label=Invoeren {0} 37 | default.show.label=Details {0} 38 | default.edit.label=Wijzigen {0} 39 | 40 | default.button.create.label=Invoeren 41 | default.button.edit.label=Wijzigen 42 | default.button.update.label=Opslaan 43 | default.button.delete.label=Verwijderen 44 | default.button.delete.confirm.message=Weet je het zeker? 45 | 46 | # Data binding errors. Use "typeMismatch.$className.$propertyName to customize (eg typeMismatch.Book.author) 47 | typeMismatch.java.net.URL=Attribuut {0} is geen geldige URL 48 | typeMismatch.java.net.URI=Attribuut {0} is geen geldige URI 49 | typeMismatch.java.util.Date=Attribuut {0} is geen geldige datum 50 | typeMismatch.java.lang.Double=Attribuut {0} is geen geldig nummer 51 | typeMismatch.java.lang.Integer=Attribuut {0} is geen geldig nummer 52 | typeMismatch.java.lang.Long=Attribuut {0} is geen geldig nummer 53 | typeMismatch.java.lang.Short=Attribuut {0} is geen geldig nummer 54 | typeMismatch.java.math.BigDecimal=Attribuut {0} is geen geldig nummer 55 | typeMismatch.java.math.BigInteger=Attribuut {0} is geen geldig nummer 56 | -------------------------------------------------------------------------------- /grails-app/i18n/messages_pl.properties: -------------------------------------------------------------------------------- 1 | # 2 | # Translated by Matthias Hryniszak - padcom@gmail.com 3 | # 4 | 5 | default.doesnt.match.message=Właściwość [{0}] klasy [{1}] o wartości [{2}] nie pasuje do wymaganego wzorca [{3}] 6 | default.invalid.url.message=Właściwość [{0}] klasy [{1}] o wartości [{2}] jest niepoprawnym adresem URL 7 | default.invalid.creditCard.message=Właściwość [{0}] klasy [{1}] with value [{2}] nie jest poprawnym numerem karty kredytowej 8 | default.invalid.email.message=Właściwość [{0}] klasy [{1}] o wartości [{2}] nie jest poprawnym adresem e-mail 9 | default.invalid.range.message=Właściwość [{0}] klasy [{1}] o wartości [{2}] nie zawiera się zakładanym zakresie od [{3}] do [{4}] 10 | default.invalid.size.message=Właściwość [{0}] klasy [{1}] o wartości [{2}] nie zawiera się w zakładanym zakresie rozmiarów od [{3}] do [{4}] 11 | default.invalid.max.message=Właściwość [{0}] klasy [{1}] o wartości [{2}] przekracza maksymalną wartość [{3}] 12 | default.invalid.min.message=Właściwość [{0}] klasy [{1}] o wartości [{2}] jest mniejsza niż minimalna wartość [{3}] 13 | default.invalid.max.size.message=Właściwość [{0}] klasy [{1}] o wartości [{2}] przekracza maksymalny rozmiar [{3}] 14 | default.invalid.min.size.message=Właściwość [{0}] klasy [{1}] o wartości [{2}] jest mniejsza niż minimalny rozmiar [{3}] 15 | default.invalid.validator.message=Właściwość [{0}] klasy [{1}] o wartości [{2}] nie spełnia założonych niestandardowych warunków 16 | default.not.inlist.message=Właściwość [{0}] klasy [{1}] o wartości [{2}] nie zawiera się w liście [{3}] 17 | default.blank.message=Właściwość [{0}] klasy [{1}] nie może być pusta 18 | default.not.equal.message=Właściwość [{0}] klasy [{1}] o wartości [{2}] nie może równać się [{3}] 19 | default.null.message=Właściwość [{0}] klasy [{1}] nie może być null 20 | default.not.unique.message=Właściwość [{0}] klasy [{1}] o wartości [{2}] musi być unikalna 21 | 22 | default.paginate.prev=Poprzedni 23 | default.paginate.next=Następny 24 | default.boolean.true=Prawda 25 | default.boolean.false=Fałsz 26 | default.date.format=yyyy-MM-dd HH:mm:ss z 27 | default.number.format=0 28 | 29 | default.created.message=Utworzono {0} {1} 30 | default.updated.message=Zaktualizowano {0} {1} 31 | default.deleted.message=Usunięto {0} {1} 32 | default.not.deleted.message={0} {1} nie mógł zostać usunięty 33 | default.not.found.message=Nie znaleziono {0} o id {1} 34 | default.optimistic.locking.failure=Inny użytkownik zaktualizował ten obiekt {0} w trakcie twoich zmian 35 | 36 | default.home.label=Strona domowa 37 | default.list.label=Lista {0} 38 | default.add.label=Dodaj {0} 39 | default.new.label=Utwórz {0} 40 | default.create.label=Utwórz {0} 41 | default.show.label=Pokaż {0} 42 | default.edit.label=Edytuj {0} 43 | 44 | default.button.create.label=Utwórz 45 | default.button.edit.label=Edytuj 46 | default.button.update.label=Zaktualizuj 47 | default.button.delete.label=Usuń 48 | default.button.delete.confirm.message=Czy jesteś pewien? 49 | 50 | # Data binding errors. Use "typeMismatch.$className.$propertyName to customize (eg typeMismatch.Book.author) 51 | typeMismatch.java.net.URL=Właściwość {0} musi być poprawnym adresem URL 52 | typeMismatch.java.net.URI=Właściwość {0} musi być poprawnym adresem URI 53 | typeMismatch.java.util.Date=Właściwość {0} musi być poprawną datą 54 | typeMismatch.java.lang.Double=Właściwość {0} musi być poprawnyą liczbą 55 | typeMismatch.java.lang.Integer=Właściwość {0} musi być poprawnyą liczbą 56 | typeMismatch.java.lang.Long=Właściwość {0} musi być poprawnyą liczbą 57 | typeMismatch.java.lang.Short=Właściwość {0} musi być poprawnyą liczbą 58 | typeMismatch.java.math.BigDecimal=Właściwość {0} musi być poprawnyą liczbą 59 | typeMismatch.java.math.BigInteger=Właściwość {0} musi być poprawnyą liczbą 60 | -------------------------------------------------------------------------------- /grails-app/i18n/messages_pt_BR.properties: -------------------------------------------------------------------------------- 1 | # 2 | # Translated by Lucas Teixeira - lucastex@gmail.com 3 | # 4 | 5 | default.doesnt.match.message=O campo [{0}] da classe [{1}] com o valor [{2}] não atende ao padrão definido [{3}] 6 | default.invalid.url.message=O campo [{0}] da classe [{1}] com o valor [{2}] não é uma URL válida 7 | default.invalid.creditCard.message=O campo [{0}] da classe [{1}] com o valor [{2}] não é um número válido de cartão de crédito 8 | default.invalid.email.message=O campo [{0}] da classe [{1}] com o valor [{2}] não é um endereço de email válido. 9 | default.invalid.range.message=O campo [{0}] da classe [{1}] com o valor [{2}] não está entre a faixa de valores válida de [{3}] até [{4}] 10 | default.invalid.size.message=O campo [{0}] da classe [{1}] com o valor [{2}] não está na faixa de tamanho válida de [{3}] até [{4}] 11 | default.invalid.max.message=O campo [{0}] da classe [{1}] com o valor [{2}] ultrapass o valor máximo [{3}] 12 | default.invalid.min.message=O campo [{0}] da classe [{1}] com o valor [{2}] não atinge o valor mínimo [{3}] 13 | default.invalid.max.size.message=O campo [{0}] da classe [{1}] com o valor [{2}] ultrapassa o tamanho máximo de [{3}] 14 | default.invalid.min.size.message=O campo [{0}] da classe [{1}] com o valor [{2}] não atinge o tamanho mínimo de [{3}] 15 | default.invalid.validator.message=O campo [{0}] da classe [{1}] com o valor [{2}] não passou na validação 16 | default.not.inlist.message=O campo [{0}] da classe [{1}] com o valor [{2}] não é um valor dentre os permitidos na lista [{3}] 17 | default.blank.message=O campo [{0}] da classe [{1}] não pode ficar em branco 18 | default.not.equal.message=O campo [{0}] da classe [{1}] com o valor [{2}] não pode ser igual a [{3}] 19 | default.null.message=O campo [{0}] da classe [{1}] não pode ser vazia 20 | default.not.unique.message=O campo [{0}] da classe [{1}] com o valor [{2}] deve ser único 21 | 22 | default.paginate.prev=Anterior 23 | default.paginate.next=Próximo 24 | default.boolean.true=Sim 25 | default.boolean.false=Não 26 | default.date.format=dd/MM/yyyy HH:mm:ss z 27 | default.number.format=0 28 | 29 | default.created.message={0} {1} criado 30 | default.updated.message={0} {1} atualizado 31 | default.deleted.message={0} {1} removido 32 | default.not.deleted.message={0} {1} não pode ser removido 33 | default.not.found.message={0} não foi encontrado com id {1} 34 | default.optimistic.locking.failure=Outro usuário atualizou este [{0}] enquanto você tentou salvá-lo 35 | 36 | default.home.label=Principal 37 | default.list.label={0} Listagem 38 | default.add.label=Adicionar {0} 39 | default.new.label=Novo {0} 40 | default.create.label=Criar {0} 41 | default.show.label=Ver {0} 42 | default.edit.label=Editar {0} 43 | 44 | default.button.create.label=Criar 45 | default.button.edit.label=Editar 46 | default.button.update.label=Alterar 47 | default.button.delete.label=Remover 48 | default.button.delete.confirm.message=Tem certeza? 49 | 50 | # Mensagens de erro em atribuição de valores. Use "typeMismatch.$className.$propertyName" para customizar (eg typeMismatch.Book.author) 51 | typeMismatch.java.net.URL=O campo {0} deve ser uma URL válida. 52 | typeMismatch.java.net.URI=O campo {0} deve ser uma URI válida. 53 | typeMismatch.java.util.Date=O campo {0} deve ser uma data válida 54 | typeMismatch.java.lang.Double=O campo {0} deve ser um número válido. 55 | typeMismatch.java.lang.Integer=O campo {0} deve ser um número válido. 56 | typeMismatch.java.lang.Long=O campo {0} deve ser um número válido. 57 | typeMismatch.java.lang.Short=O campo {0} deve ser um número válido. 58 | typeMismatch.java.math.BigDecimal=O campo {0} deve ser um número válido. 59 | typeMismatch.java.math.BigInteger=O campo {0} deve ser um número válido. -------------------------------------------------------------------------------- /grails-app/i18n/messages_pt_PT.properties: -------------------------------------------------------------------------------- 1 | # 2 | # translation by miguel.ping@gmail.com, based on pt_BR translation by Lucas Teixeira - lucastex@gmail.com 3 | # 4 | 5 | default.doesnt.match.message=O campo [{0}] da classe [{1}] com o valor [{2}] não corresponde ao padrão definido [{3}] 6 | default.invalid.url.message=O campo [{0}] da classe [{1}] com o valor [{2}] não é um URL válido 7 | default.invalid.creditCard.message=O campo [{0}] da classe [{1}] com o valor [{2}] não é um número válido de cartão de crédito 8 | default.invalid.email.message=O campo [{0}] da classe [{1}] com o valor [{2}] não é um endereço de email válido. 9 | default.invalid.range.message=O campo [{0}] da classe [{1}] com o valor [{2}] não está dentro dos limites de valores válidos de [{3}] a [{4}] 10 | default.invalid.size.message=O campo [{0}] da classe [{1}] com o valor [{2}] está fora dos limites de tamanho válido de [{3}] a [{4}] 11 | default.invalid.max.message=O campo [{0}] da classe [{1}] com o valor [{2}] ultrapassa o valor máximo [{3}] 12 | default.invalid.min.message=O campo [{0}] da classe [{1}] com o valor [{2}] não atinge o valor mínimo [{3}] 13 | default.invalid.max.size.message=O campo [{0}] da classe [{1}] com o valor [{2}] ultrapassa o tamanho máximo de [{3}] 14 | default.invalid.min.size.message=O campo [{0}] da classe [{1}] com o valor [{2}] não atinge o tamanho mínimo de [{3}] 15 | default.invalid.validator.message=O campo [{0}] da classe [{1}] com o valor [{2}] não passou na validação 16 | default.not.inlist.message=O campo [{0}] da classe [{1}] com o valor [{2}] não se encontra nos valores permitidos da lista [{3}] 17 | default.blank.message=O campo [{0}] da classe [{1}] não pode ser vazio 18 | default.not.equal.message=O campo [{0}] da classe [{1}] com o valor [{2}] não pode ser igual a [{3}] 19 | default.null.message=O campo [{0}] da classe [{1}] não pode ser vazio 20 | default.not.unique.message=O campo [{0}] da classe [{1}] com o valor [{2}] deve ser único 21 | 22 | default.paginate.prev=Anterior 23 | default.paginate.next=Próximo 24 | 25 | # Mensagens de erro em atribuição de valores. Use "typeMismatch.$className.$propertyName" para personalizar(eg typeMismatch.Book.author) 26 | typeMismatch.java.net.URL=O campo {0} deve ser um URL válido. 27 | typeMismatch.java.net.URI=O campo {0} deve ser um URI válido. 28 | typeMismatch.java.util.Date=O campo {0} deve ser uma data válida 29 | typeMismatch.java.lang.Double=O campo {0} deve ser um número válido. 30 | typeMismatch.java.lang.Integer=O campo {0} deve ser um número válido. 31 | typeMismatch.java.lang.Long=O campo {0} deve ser um número valido. 32 | typeMismatch.java.lang.Short=O campo {0} deve ser um número válido. 33 | typeMismatch.java.math.BigDecimal=O campo {0} deve ser um número válido. 34 | typeMismatch.java.math.BigInteger=O campo {0} deve ser um número válido. 35 | -------------------------------------------------------------------------------- /grails-app/i18n/messages_ru.properties: -------------------------------------------------------------------------------- 1 | default.doesnt.match.message=Значение [{2}] поля [{0}] класса [{1}] не соответствует образцу [{3}] 2 | default.invalid.url.message=Значение [{2}] поля [{0}] класса [{1}] не является допустимым URL-адресом 3 | default.invalid.creditCard.message=Значение [{2}] поля [{0}] класса [{1}] не является допустимым номером кредитной карты 4 | default.invalid.email.message=Значение [{2}] поля [{0}] класса [{1}] не является допустимым e-mail адресом 5 | default.invalid.range.message=Значение [{2}] поля [{0}] класса [{1}] не попадает в допустимый интервал от [{3}] до [{4}] 6 | default.invalid.size.message=Размер поля [{0}] класса [{1}] (значение: [{2}]) не попадает в допустимый интервал от [{3}] до [{4}] 7 | default.invalid.max.message=Значение [{2}] поля [{0}] класса [{1}] больше чем максимально допустимое значение [{3}] 8 | default.invalid.min.message=Значение [{2}] поля [{0}] класса [{1}] меньше чем минимально допустимое значение [{3}] 9 | default.invalid.max.size.message=Размер поля [{0}] класса [{1}] (значение: [{2}]) больше чем максимально допустимый размер [{3}] 10 | default.invalid.min.size.message=Размер поля [{0}] класса [{1}] (значение: [{2}]) меньше чем минимально допустимый размер [{3}] 11 | default.invalid.validator.message=Значение [{2}] поля [{0}] класса [{1}] не допустимо 12 | default.not.inlist.message=Значение [{2}] поля [{0}] класса [{1}] не попадает в список допустимых значений [{3}] 13 | default.blank.message=Поле [{0}] класса [{1}] не может быть пустым 14 | default.not.equal.message=Значение [{2}] поля [{0}] класса [{1}] не может быть равно [{3}] 15 | default.null.message=Поле [{0}] класса [{1}] не может иметь значение null 16 | default.not.unique.message=Значение [{2}] поля [{0}] класса [{1}] должно быть уникальным 17 | 18 | default.paginate.prev=Предыдушая страница 19 | default.paginate.next=Следующая страница 20 | 21 | # Ошибки при присвоении данных. Для точной настройки для полей классов используйте 22 | # формат "typeMismatch.$className.$propertyName" (например, typeMismatch.Book.author) 23 | typeMismatch.java.net.URL=Значение поля {0} не является допустимым URL 24 | typeMismatch.java.net.URI=Значение поля {0} не является допустимым URI 25 | typeMismatch.java.util.Date=Значение поля {0} не является допустимой датой 26 | typeMismatch.java.lang.Double=Значение поля {0} не является допустимым числом 27 | typeMismatch.java.lang.Integer=Значение поля {0} не является допустимым числом 28 | typeMismatch.java.lang.Long=Значение поля {0} не является допустимым числом 29 | typeMismatch.java.lang.Short=Значение поля {0} не является допустимым числом 30 | typeMismatch.java.math.BigDecimal=Значение поля {0} не является допустимым числом 31 | typeMismatch.java.math.BigInteger=Значение поля {0} не является допустимым числом 32 | -------------------------------------------------------------------------------- /grails-app/i18n/messages_sv.properties: -------------------------------------------------------------------------------- 1 | default.doesnt.match.message=Attributet [{0}] för klassen [{1}] med värde [{2}] matchar inte mot uttrycket [{3}] 2 | default.invalid.url.message=Attributet [{0}] för klassen [{1}] med värde [{2}] är inte en giltig URL 3 | default.invalid.creditCard.message=Attributet [{0}] för klassen [{1}] med värde [{2}] är inte ett giltigt kreditkortsnummer 4 | default.invalid.email.message=Attributet [{0}] för klassen [{1}] med värde [{2}] är inte en giltig e-postadress 5 | default.invalid.range.message=Attributet [{0}] för klassen [{1}] med värde [{2}] är inte inom intervallet [{3}] till [{4}] 6 | default.invalid.size.message=Attributet [{0}] för klassen [{1}] med värde [{2}] har en storlek som inte är inom [{3}] till [{4}] 7 | default.invalid.max.message=Attributet [{0}] för klassen [{1}] med värde [{2}] överskrider maxvärdet [{3}] 8 | default.invalid.min.message=Attributet [{0}] för klassen [{1}] med värde [{2}] är mindre än minimivärdet [{3}] 9 | default.invalid.max.size.message=Attributet [{0}] för klassen [{1}] med värde [{2}] överskrider maxstorleken [{3}] 10 | default.invalid.min.size.message=Attributet [{0}] för klassen [{1}] med värde [{2}] är mindre än minimistorleken [{3}] 11 | default.invalid.validator.message=Attributet [{0}] för klassen [{1}] med värde [{2}] är inte giltigt enligt anpassad regel 12 | default.not.inlist.message=Attributet [{0}] för klassen [{1}] med värde [{2}] är inte giltigt, måste vara ett av [{3}] 13 | default.blank.message=Attributet [{0}] för klassen [{1}] får inte vara tomt 14 | default.not.equal.message=Attributet [{0}] för klassen [{1}] med värde [{2}] får inte vara lika med [{3}] 15 | default.null.message=Attributet [{0}] för klassen [{1}] får inte vara tomt 16 | default.not.unique.message=Attributet [{0}] för klassen [{1}] med värde [{2}] måste vara unikt 17 | 18 | default.paginate.prev=Föregående 19 | default.paginate.next=Nästa 20 | default.boolean.true=Sant 21 | default.boolean.false=Falskt 22 | default.date.format=yyyy-MM-dd HH:mm:ss z 23 | default.number.format=0 24 | 25 | default.created.message={0} {1} skapades 26 | default.updated.message={0} {1} uppdaterades 27 | default.deleted.message={0} {1} borttagen 28 | default.not.deleted.message={0} {1} kunde inte tas bort 29 | default.not.found.message={0} med id {1} kunde inte hittas 30 | default.optimistic.locking.failure=En annan användare har uppdaterat det här {0} objektet medan du redigerade det 31 | 32 | default.home.label=Hem 33 | default.list.label= {0} - Lista 34 | default.add.label=Lägg till {0} 35 | default.new.label=Skapa {0} 36 | default.create.label=Skapa {0} 37 | default.show.label=Visa {0} 38 | default.edit.label=Ändra {0} 39 | 40 | default.button.create.label=Skapa 41 | default.button.edit.label=Ändra 42 | default.button.update.label=Uppdatera 43 | default.button.delete.label=Ta bort 44 | default.button.delete.confirm.message=Är du säker? 45 | 46 | # Data binding errors. Use "typeMismatch.$className.$propertyName to customize (eg typeMismatch.Book.author) 47 | typeMismatch.java.net.URL=Värdet för {0} måste vara en giltig URL 48 | typeMismatch.java.net.URI=Värdet för {0} måste vara en giltig URI 49 | typeMismatch.java.util.Date=Värdet {0} måste vara ett giltigt datum 50 | typeMismatch.java.lang.Double=Värdet {0} måste vara ett giltigt nummer 51 | typeMismatch.java.lang.Integer=Värdet {0} måste vara ett giltigt heltal 52 | typeMismatch.java.lang.Long=Värdet {0} måste vara ett giltigt heltal 53 | typeMismatch.java.lang.Short=Värdet {0} måste vara ett giltigt heltal 54 | typeMismatch.java.math.BigDecimal=Värdet {0} måste vara ett giltigt nummer 55 | typeMismatch.java.math.BigInteger=Värdet {0} måste vara ett giltigt heltal -------------------------------------------------------------------------------- /grails-app/i18n/messages_th.properties: -------------------------------------------------------------------------------- 1 | default.doesnt.match.message=คุณสมบัติ [{0}] ของคลาส [{1}] ซึ่งมีค่าเป็น [{2}] ไม่ถูกต้องตามรูปแบบที่กำหนดไว้ใน [{3}] 2 | default.invalid.url.message=คุณสมบัติ [{0}] ของคลาส [{1}] ซึ่งมีค่าเป็น [{2}] ไม่ถูกต้องตามรูปแบบ URL 3 | default.invalid.creditCard.message=คุณสมบัติ [{0}] ของคลาส [{1}] ซึ่งมีค่าเป็น [{2}] ไม่ถูกต้องตามรูปแบบหมายเลขบัตรเครดิต 4 | default.invalid.email.message=คุณสมบัติ [{0}] ของคลาส [{1}] ซึ่งมีค่าเป็น [{2}] ไม่ถูกต้องตามรูปแบบอีเมล์ 5 | default.invalid.range.message=คุณสมบัติ [{0}] ของคลาส [{1}] ซึ่งมีค่าเป็น [{2}] ไม่ได้มีค่าที่ถูกต้องในช่วงจาก [{3}] ถึง [{4}] 6 | default.invalid.size.message=คุณสมบัติ [{0}] ของคลาส [{1}] ซึ่งมีค่าเป็น [{2}] ไม่ได้มีขนาดที่ถูกต้องในช่วงจาก [{3}] ถึง [{4}] 7 | default.invalid.max.message=คุณสมบัติ [{0}] ของคลาส [{1}] ซึ่งมีค่าเป็น [{2}] มีค่าเกิดกว่าค่ามากสุด [{3}] 8 | default.invalid.min.message=คุณสมบัติ [{0}] ของคลาส [{1}] ซึ่งมีค่าเป็น [{2}] มีค่าน้อยกว่าค่าต่ำสุด [{3}] 9 | default.invalid.max.size.message=คุณสมบัติ [{0}] ของคลาส [{1}] ซึ่งมีค่าเป็น [{2}] มีขนาดเกินกว่าขนาดมากสุดของ [{3}] 10 | default.invalid.min.size.message=คุณสมบัติ [{0}] ของคลาส [{1}] ซึ่งมีค่าเป็น [{2}] มีขนาดต่ำกว่าขนาดต่ำสุดของ [{3}] 11 | default.invalid.validator.message=คุณสมบัติ [{0}] ของคลาส [{1}] ซึ่งมีค่าเป็น [{2}] ไม่ผ่านการทวนสอบค่าที่ตั้งขึ้น 12 | default.not.inlist.message=คุณสมบัติ [{0}] ของคลาส [{1}] ซึ่งมีค่าเป็น [{2}] ไม่ได้อยู่ในรายการต่อไปนี้ [{3}] 13 | default.blank.message=คุณสมบัติ [{0}] ของคลาส [{1}] ไม่สามารถเป็นค่าว่างได้ 14 | default.not.equal.message=คุณสมบัติ [{0}] ของคลาส [{1}] ซึ่งมีค่าเป็น [{2}] ไม่สามารถเท่ากับ [{3}] ได้ 15 | default.null.message=คุณสมบัติ [{0}] ของคลาส [{1}] ไม่สามารถเป็น null ได้ 16 | default.not.unique.message=คุณสมบัติ [{0}] ของคลาส [{1}] ซึ่งมีค่าเป็น [{2}] จะต้องไม่ซ้ำ (unique) 17 | 18 | default.paginate.prev=ก่อนหน้า 19 | default.paginate.next=ถัดไป 20 | default.boolean.true=จริง 21 | default.boolean.false=เท็จ 22 | default.date.format=dd-MM-yyyy HH:mm:ss z 23 | default.number.format=0 24 | 25 | default.created.message=สร้าง {0} {1} เรียบร้อยแล้ว 26 | default.updated.message=ปรับปรุง {0} {1} เรียบร้อยแล้ว 27 | default.deleted.message=ลบ {0} {1} เรียบร้อยแล้ว 28 | default.not.deleted.message=ไม่สามารถลบ {0} {1} 29 | default.not.found.message=ไม่พบ {0} ด้วย id {1} นี้ 30 | default.optimistic.locking.failure=มีผู้ใช้ท่านอื่นปรับปรุง {0} ขณะที่คุณกำลังแก้ไขข้อมูลอยู่ 31 | 32 | default.home.label=หน้าแรก 33 | default.list.label=รายการ {0} 34 | default.add.label=เพิ่ม {0} 35 | default.new.label=สร้าง {0} ใหม่ 36 | default.create.label=สร้าง {0} 37 | default.show.label=แสดง {0} 38 | default.edit.label=แก้ไข {0} 39 | 40 | default.button.create.label=สร้าง 41 | default.button.edit.label=แก้ไข 42 | default.button.update.label=ปรับปรุง 43 | default.button.delete.label=ลบ 44 | default.button.delete.confirm.message=คุณแน่ใจหรือไม่ ? 45 | 46 | # Data binding errors. Use "typeMismatch.$className.$propertyName to customize (eg typeMismatch.Book.author) 47 | typeMismatch.java.net.URL=คุณสมบัติ '{0}' จะต้องเป็นค่า URL ที่ถูกต้อง 48 | typeMismatch.java.net.URI=คุณสมบัติ '{0}' จะต้องเป็นค่า URI ที่ถูกต้อง 49 | typeMismatch.java.util.Date=คุณสมบัติ '{0}' จะต้องมีค่าเป็นวันที่ 50 | typeMismatch.java.lang.Double=คุณสมบัติ '{0}' จะต้องมีค่าเป็นจำนวนประเภท Double 51 | typeMismatch.java.lang.Integer=คุณสมบัติ '{0}' จะต้องมีค่าเป็นจำนวนประเภท Integer 52 | typeMismatch.java.lang.Long=คุณสมบัติ '{0}' จะต้องมีค่าเป็นจำนวนประเภท Long 53 | typeMismatch.java.lang.Short=คุณสมบัติ '{0}' จะต้องมีค่าเป็นจำนวนประเภท Short 54 | typeMismatch.java.math.BigDecimal=คุณสมบัติ '{0}' จะต้องมีค่าเป็นจำนวนประเภท BigDecimal 55 | typeMismatch.java.math.BigInteger=คุณสมบัติ '{0}' จะต้องมีค่าเป็นจำนวนประเภท BigInteger 56 | -------------------------------------------------------------------------------- /grails-app/i18n/messages_zh_CN.properties: -------------------------------------------------------------------------------- 1 | default.blank.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u4E0D\u80FD\u4E3A\u7A7A 2 | default.doesnt.match.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u4E0E\u5B9A\u4E49\u7684\u6A21\u5F0F [{3}]\u4E0D\u5339\u914D 3 | default.invalid.creditCard.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u4E0D\u662F\u4E00\u4E2A\u6709\u6548\u7684\u4FE1\u7528\u5361\u53F7 4 | default.invalid.email.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u4E0D\u662F\u4E00\u4E2A\u5408\u6CD5\u7684\u7535\u5B50\u90AE\u4EF6\u5730\u5740 5 | default.invalid.max.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u6BD4\u6700\u5927\u503C [{3}]\u8FD8\u5927 6 | default.invalid.max.size.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u7684\u5927\u5C0F\u6BD4\u6700\u5927\u503C [{3}]\u8FD8\u5927 7 | default.invalid.min.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u6BD4\u6700\u5C0F\u503C [{3}]\u8FD8\u5C0F 8 | default.invalid.min.size.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u7684\u5927\u5C0F\u6BD4\u6700\u5C0F\u503C [{3}]\u8FD8\u5C0F 9 | default.invalid.range.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u4E0D\u5728\u5408\u6CD5\u7684\u8303\u56F4\u5185( [{3}] \uFF5E [{4}] ) 10 | default.invalid.size.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u7684\u5927\u5C0F\u4E0D\u5728\u5408\u6CD5\u7684\u8303\u56F4\u5185( [{3}] \uFF5E [{4}] ) 11 | default.invalid.url.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u4E0D\u662F\u4E00\u4E2A\u5408\u6CD5\u7684URL 12 | default.invalid.validator.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u672A\u80FD\u901A\u8FC7\u81EA\u5B9A\u4E49\u7684\u9A8C\u8BC1 13 | default.not.equal.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u4E0E[{3}]\u4E0D\u76F8\u7B49 14 | default.not.inlist.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u4E0D\u5728\u5217\u8868\u7684\u53D6\u503C\u8303\u56F4\u5185 15 | default.not.unique.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u7684\u503C[{2}]\u5FC5\u987B\u662F\u552F\u4E00\u7684 16 | default.null.message=[{1}]\u7C7B\u7684\u5C5E\u6027[{0}]\u4E0D\u80FD\u4E3Anull 17 | default.paginate.next=\u4E0B\u9875 18 | default.paginate.prev=\u4E0A\u9875 19 | -------------------------------------------------------------------------------- /grails-app/migrations/2014-05-28-added-default-user-values.groovy: -------------------------------------------------------------------------------- 1 | databaseChangeLog = { 2 | } 3 | -------------------------------------------------------------------------------- /grails-app/migrations/2014-05-28-added-job-listing.groovy: -------------------------------------------------------------------------------- 1 | databaseChangeLog = { 2 | 3 | changeSet(author: "cyrusmalekpour (generated)", id: "1401312018747-1") { 4 | createTable(tableName: "job_listing") { 5 | column(autoIncrement: "true", name: "id", type: "bigint") { 6 | constraints(nullable: "false", primaryKey: "true", primaryKeyName: "job_listingPK") 7 | } 8 | 9 | column(name: "version", type: "bigint") { 10 | constraints(nullable: "false") 11 | } 12 | 13 | column(name: "description", type: "varchar(255)") { 14 | constraints(nullable: "false") 15 | } 16 | 17 | column(name: "name", type: "varchar(255)") { 18 | constraints(nullable: "false") 19 | } 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /grails-app/migrations/2014-05-28-added-updated-constraints.groovy: -------------------------------------------------------------------------------- 1 | databaseChangeLog = { 2 | } 3 | -------------------------------------------------------------------------------- /grails-app/migrations/2014-05-28-added-updated-nullability.groovy: -------------------------------------------------------------------------------- 1 | databaseChangeLog = { 2 | 3 | changeSet(author: "cyrusmalekpour (generated)", id: "1401306152228-1") { 4 | modifyDataType(columnName: "UPDATED_AT", newDataType: "datetime", tableName: "USER") 5 | } 6 | 7 | changeSet(author: "cyrusmalekpour (generated)", id: "1401306152228-2") { 8 | dropNotNullConstraint(columnDataType: "datetime", columnName: "UPDATED_AT", tableName: "USER") 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /grails-app/migrations/2014-05-28-initial-database.groovy: -------------------------------------------------------------------------------- 1 | databaseChangeLog = { 2 | } 3 | -------------------------------------------------------------------------------- /grails-app/migrations/2014-05-29-added-job-listing-company.groovy: -------------------------------------------------------------------------------- 1 | databaseChangeLog = { 2 | 3 | changeSet(author: "cyrusmalekpour (generated)", id: "1401394933211-1") { 4 | createTable(tableName: "company") { 5 | column(autoIncrement: "true", name: "id", type: "bigint") { 6 | constraints(nullable: "false", primaryKey: "true", primaryKeyName: "companyPK") 7 | } 8 | 9 | column(name: "version", type: "bigint") { 10 | constraints(nullable: "false") 11 | } 12 | 13 | column(name: "description", type: "varchar(255)") { 14 | constraints(nullable: "false") 15 | } 16 | 17 | column(name: "name", type: "varchar(255)") { 18 | constraints(nullable: "false") 19 | } 20 | 21 | column(name: "website", type: "varchar(255)") { 22 | constraints(nullable: "false") 23 | } 24 | } 25 | } 26 | 27 | changeSet(author: "cyrusmalekpour (generated)", id: "1401394933211-2") { 28 | addColumn(tableName: "job_listing") { 29 | column(name: "company_id", type: "bigint") { 30 | constraints(nullable: "false") 31 | } 32 | } 33 | } 34 | 35 | changeSet(author: "cyrusmalekpour (generated)", id: "1401394933211-3") { 36 | addColumn(tableName: "job_listing") { 37 | column(name: "fulltime", type: "bit") { 38 | constraints(nullable: "false") 39 | } 40 | } 41 | } 42 | 43 | changeSet(author: "cyrusmalekpour (generated)", id: "1401394933211-4") { 44 | addColumn(tableName: "job_listing") { 45 | column(name: "location", type: "varchar(255)") { 46 | constraints(nullable: "false") 47 | } 48 | } 49 | } 50 | 51 | changeSet(author: "cyrusmalekpour (generated)", id: "1401394933211-5") { 52 | addColumn(tableName: "job_listing") { 53 | column(name: "startdate", type: "datetime") { 54 | constraints(nullable: "false") 55 | } 56 | } 57 | } 58 | 59 | changeSet(author: "cyrusmalekpour (generated)", id: "1401394933211-7") { 60 | createIndex(indexName: "FK_hw77dwjghu9m2i9ndkkraynpu", tableName: "job_listing") { 61 | column(name: "company_id") 62 | } 63 | } 64 | 65 | changeSet(author: "cyrusmalekpour (generated)", id: "1401394933211-6") { 66 | addForeignKeyConstraint(baseColumnNames: "company_id", baseTableName: "job_listing", constraintName: "FK_hw77dwjghu9m2i9ndkkraynpu", deferrable: "false", initiallyDeferred: "false", referencedColumnNames: "id", referencedTableName: "company", referencesUniqueColumn: "false") 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /grails-app/migrations/2014-05-29-added-nullability-on-auth_token.groovy: -------------------------------------------------------------------------------- 1 | databaseChangeLog = { 2 | 3 | changeSet(author: "cyrusmalekpour (generated)", id: "1401375915691-1") { 4 | modifyDataType(columnName: "AUTH_TOKEN", newDataType: "varchar(30)", tableName: "USER") 5 | } 6 | 7 | changeSet(author: "cyrusmalekpour (generated)", id: "1401375915691-2") { 8 | dropNotNullConstraint(columnDataType: "varchar(30)", columnName: "AUTH_TOKEN", tableName: "USER") 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /grails-app/migrations/2014-05-29-added-nullable-created.groovy: -------------------------------------------------------------------------------- 1 | databaseChangeLog = { 2 | 3 | changeSet(author: "cyrusmalekpour (generated)", id: "1401397474888-1") { 4 | modifyDataType(columnName: "CREATED_AT", newDataType: "datetime", tableName: "USER") 5 | } 6 | 7 | changeSet(author: "cyrusmalekpour (generated)", id: "1401397474888-2") { 8 | dropNotNullConstraint(columnDataType: "datetime", columnName: "CREATED_AT", tableName: "USER") 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /grails-app/migrations/2014-05-29-updated-token-fields-again.groovy: -------------------------------------------------------------------------------- 1 | databaseChangeLog = { 2 | } 3 | -------------------------------------------------------------------------------- /grails-app/migrations/2014-05-29-updated-token-fields.groovy: -------------------------------------------------------------------------------- 1 | databaseChangeLog = { 2 | 3 | changeSet(author: "cyrusmalekpour (generated)", id: "1401378377984-1") { 4 | addColumn(tableName: "user") { 5 | column(name: "forgot_token", type: "varchar(30)") 6 | } 7 | } 8 | 9 | changeSet(author: "cyrusmalekpour (generated)", id: "1401378377984-2") { 10 | addColumn(tableName: "user") { 11 | column(name: "verify_token", type: "varchar(30)") 12 | } 13 | } 14 | 15 | changeSet(author: "cyrusmalekpour (generated)", id: "1401378377984-3") { 16 | dropColumn(columnName: "AUTH_TOKEN", tableName: "USER") 17 | } 18 | 19 | changeSet(author: "cyrusmalekpour (generated)", id: "1401378377984-4") { 20 | dropColumn(columnName: "VERIFIED", tableName: "USER") 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /grails-app/migrations/2014-05-30-added-user-description.groovy: -------------------------------------------------------------------------------- 1 | databaseChangeLog = { 2 | 3 | changeSet(author: "cyrusmalekpour (generated)", id: "1401462839016-1") { 4 | addColumn(tableName: "user") { 5 | column(name: "description", type: "varchar(3000)") 6 | } 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /grails-app/migrations/2014-05-30-user-resumes.groovy: -------------------------------------------------------------------------------- 1 | databaseChangeLog = { 2 | 3 | changeSet(author: "cyrusmalekpour (generated)", id: "1401479283852-1") { 4 | addColumn(tableName: "user") { 5 | column(name: "resume", type: "varchar(255)") 6 | } 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /grails-app/migrations/2014-06-02-added-field-constraints.groovy: -------------------------------------------------------------------------------- 1 | databaseChangeLog = { 2 | 3 | changeSet(author: "cyrusmalekpour (generated)", id: "1401738106169-1") { 4 | addColumn(tableName: "job_listing") { 5 | column(name: "howtoapply", type: "varchar(3000)") 6 | } 7 | } 8 | 9 | changeSet(author: "cyrusmalekpour (generated)", id: "1401738106169-2") { 10 | addColumn(tableName: "job_listing") { 11 | column(name: "requirements", type: "varchar(3000)") 12 | } 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /grails-app/migrations/2014-06-02-added-fullname-to-user.groovy: -------------------------------------------------------------------------------- 1 | databaseChangeLog = { 2 | 3 | changeSet(author: "cyrusmalekpour (generated)", id: "1401727222343-1") { 4 | addColumn(tableName: "user") { 5 | column(name: "fullname", type: "varchar(600)") { 6 | constraints(nullable: "false") 7 | } 8 | } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /grails-app/migrations/2014-06-02-added-log-constraints.groovy: -------------------------------------------------------------------------------- 1 | databaseChangeLog = { 2 | } 3 | -------------------------------------------------------------------------------- /grails-app/migrations/2014-06-02-added-log-nullables.groovy: -------------------------------------------------------------------------------- 1 | databaseChangeLog = { 2 | 3 | changeSet(author: "cyrusmalekpour (generated)", id: "1401741597725-1") { 4 | dropNotNullConstraint(columnDataType: "varchar(2000)", columnName: "parameters", tableName: "log") 5 | } 6 | 7 | changeSet(author: "cyrusmalekpour (generated)", id: "1401741597725-2") { 8 | dropNotNullConstraint(columnDataType: "varchar(2000)", columnName: "referer", tableName: "log") 9 | } 10 | 11 | changeSet(author: "cyrusmalekpour (generated)", id: "1401741597725-3") { 12 | dropNotNullConstraint(columnDataType: "varchar(2000)", columnName: "useragent", tableName: "log") 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /grails-app/migrations/2014-06-02-added-messages.groovy: -------------------------------------------------------------------------------- 1 | databaseChangeLog = { 2 | 3 | changeSet(author: "cyrusmalekpour (generated)", id: "1401722600945-1") { 4 | createTable(tableName: "message") { 5 | column(autoIncrement: "true", name: "id", type: "bigint") { 6 | constraints(nullable: "false", primaryKey: "true", primaryKeyName: "messagePK") 7 | } 8 | 9 | column(name: "version", type: "bigint") { 10 | constraints(nullable: "false") 11 | } 12 | 13 | column(name: "author_id", type: "integer") { 14 | constraints(nullable: "false") 15 | } 16 | 17 | column(name: "body", type: "varchar(255)") { 18 | constraints(nullable: "false") 19 | } 20 | 21 | column(name: "recipient_id", type: "bigint") { 22 | constraints(nullable: "false") 23 | } 24 | 25 | column(name: "subject", type: "varchar(255)") { 26 | constraints(nullable: "false") 27 | } 28 | } 29 | } 30 | 31 | changeSet(author: "cyrusmalekpour (generated)", id: "1401722600945-3") { 32 | createIndex(indexName: "FK_60b0338jqfujfk48rlpwro1cj", tableName: "message") { 33 | column(name: "recipient_id") 34 | } 35 | } 36 | 37 | changeSet(author: "cyrusmalekpour (generated)", id: "1401722600945-2") { 38 | addForeignKeyConstraint(baseColumnNames: "recipient_id", baseTableName: "message", constraintName: "FK_60b0338jqfujfk48rlpwro1cj", deferrable: "false", initiallyDeferred: "false", referencedColumnNames: "id", referencedTableName: "user", referencesUniqueColumn: "false") 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /grails-app/migrations/2014-06-02-added-user-access-level.groovy: -------------------------------------------------------------------------------- 1 | databaseChangeLog = { 2 | 3 | changeSet(author: "cyrusmalekpour (generated)", id: "1401806465151-1") { 4 | addColumn(tableName: "user") { 5 | column(name: "accesslevel", type: "integer") { 6 | constraints(nullable: "false") 7 | } 8 | } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /grails-app/migrations/2014-06-02-added-user-lockout-fields.groovy: -------------------------------------------------------------------------------- 1 | databaseChangeLog = { 2 | 3 | changeSet(author: "cyrusmalekpour (generated)", id: "1401817098138-1") { 4 | addColumn(tableName: "user") { 5 | column(name: "attempts", type: "integer") { 6 | constraints(nullable: "false") 7 | } 8 | } 9 | } 10 | 11 | changeSet(author: "cyrusmalekpour (generated)", id: "1401817098138-2") { 12 | addColumn(tableName: "user") { 13 | column(name: "latest_attempt", type: "datetime") 14 | } 15 | } 16 | 17 | changeSet(author: "cyrusmalekpour (generated)", id: "1401817098138-3") { 18 | addColumn(tableName: "user") { 19 | column(name: "original_attempt", type: "datetime") 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /grails-app/migrations/2014-06-02-added-user-reset-token.groovy: -------------------------------------------------------------------------------- 1 | databaseChangeLog = { 2 | 3 | changeSet(author: "cyrusmalekpour (generated)", id: "1401819439490-1") { 4 | addColumn(tableName: "user") { 5 | column(name: "reset_token", type: "varchar(30)") 6 | } 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /grails-app/migrations/2014-06-02-analytics.groovy: -------------------------------------------------------------------------------- 1 | databaseChangeLog = { 2 | 3 | changeSet(author: "cyrusmalekpour (generated)", id: "1401734778357-1") { 4 | createTable(tableName: "log") { 5 | column(autoIncrement: "true", name: "id", type: "bigint") { 6 | constraints(nullable: "false", primaryKey: "true", primaryKeyName: "logPK") 7 | } 8 | 9 | column(name: "version", type: "bigint") { 10 | constraints(nullable: "false") 11 | } 12 | 13 | column(name: "ip", type: "varchar(255)") { 14 | constraints(nullable: "false") 15 | } 16 | 17 | column(name: "page", type: "varchar(255)") { 18 | constraints(nullable: "false") 19 | } 20 | 21 | column(name: "parameters", type: "varchar(255)") { 22 | constraints(nullable: "false") 23 | } 24 | 25 | column(name: "referer", type: "varchar(255)") { 26 | constraints(nullable: "false") 27 | } 28 | 29 | column(name: "useragent", type: "varchar(255)") { 30 | constraints(nullable: "false") 31 | } 32 | } 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /grails-app/migrations/2014-06-02-changed-field-types-again-again.groovy: -------------------------------------------------------------------------------- 1 | databaseChangeLog = { 2 | } 3 | -------------------------------------------------------------------------------- /grails-app/migrations/2014-06-02-changed-field-types-again.groovy: -------------------------------------------------------------------------------- 1 | databaseChangeLog = { 2 | 3 | changeSet(author: "cyrusmalekpour (generated)", id: "1401820437561-1") { 4 | addNotNullConstraint(columnDataType: "bigint", columnName: "latest_attempt", tableName: "user") 5 | } 6 | 7 | changeSet(author: "cyrusmalekpour (generated)", id: "1401820437561-2") { 8 | modifyDataType(columnName: "original_attempt", newDataType: "bigint", tableName: "user") 9 | } 10 | 11 | changeSet(author: "cyrusmalekpour (generated)", id: "1401820437561-3") { 12 | addNotNullConstraint(columnDataType: "bigint", columnName: "original_attempt", tableName: "user") 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /grails-app/migrations/2014-06-02-changed-field-types.groovy: -------------------------------------------------------------------------------- 1 | databaseChangeLog = { 2 | 3 | changeSet(author: "cyrusmalekpour (generated)", id: "1401820126051-1") { 4 | modifyDataType(columnName: "latest_attempt", newDataType: "bigint", tableName: "user") 5 | } 6 | 7 | changeSet(author: "cyrusmalekpour (generated)", id: "1401820126051-2") { 8 | addNotNullConstraint(columnDataType: "bigint", columnName: "latest_attempt", tableName: "user") 9 | } 10 | 11 | changeSet(author: "cyrusmalekpour (generated)", id: "1401820126051-3") { 12 | modifyDataType(columnName: "original_attempt", newDataType: "bigint", tableName: "user") 13 | } 14 | 15 | changeSet(author: "cyrusmalekpour (generated)", id: "1401820126051-4") { 16 | addNotNullConstraint(columnDataType: "bigint", columnName: "original_attempt", tableName: "user") 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /grails-app/migrations/2014-06-02-more-message-tweaks.groovy: -------------------------------------------------------------------------------- 1 | databaseChangeLog = { 2 | } 3 | -------------------------------------------------------------------------------- /grails-app/migrations/2014-06-04-added-user-ssn.groovy: -------------------------------------------------------------------------------- 1 | databaseChangeLog = { 2 | 3 | changeSet(author: "cyrusmalekpour (generated)", id: "1401899841549-1") { 4 | addColumn(tableName: "user") { 5 | column(name: "ssn", type: "varchar(11)") 6 | } 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /grails-app/migrations/2014-06-24-adding-employees.groovy: -------------------------------------------------------------------------------- 1 | databaseChangeLog = { 2 | 3 | changeSet(author: "cyrusmalekpour (generated)", id: "1403633657074-1") { 4 | addColumn(tableName: "user") { 5 | column(name: "employer_id", type: "bigint") 6 | } 7 | } 8 | 9 | changeSet(author: "cyrusmalekpour (generated)", id: "1403633657074-2") { 10 | addForeignKeyConstraint(baseColumnNames: "employer_id", baseTableName: "user", constraintName: "FK_ggbcixcrmm7q2anlgt4jm9htm", deferrable: "false", initiallyDeferred: "false", referencedColumnNames: "id", referencedTableName: "company", referencesUniqueColumn: "false") 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /grails-app/migrations/changelog.groovy: -------------------------------------------------------------------------------- 1 | databaseChangeLog = { 2 | 3 | changeSet(author: "cyrusmalekpour (generated)", id: "1401301791279-1") { 4 | createTable(tableName: "USER") { 5 | column(autoIncrement: "true", name: "ID", type: "BIGINT") { 6 | constraints(nullable: "false", primaryKey: "true", primaryKeyName: "CONSTRAINT_2") 7 | } 8 | 9 | column(name: "VERSION", type: "BIGINT") { 10 | constraints(nullable: "false") 11 | } 12 | 13 | column(name: "AUTH_TOKEN", type: "VARCHAR(255)") { 14 | constraints(nullable: "false") 15 | } 16 | 17 | column(name: "CREATED_AT", type: "TIMESTAMP") { 18 | constraints(nullable: "false") 19 | } 20 | 21 | column(name: "EMAIL", type: "VARCHAR(255)") { 22 | constraints(nullable: "false") 23 | } 24 | 25 | column(name: "FIRSTNAME", type: "VARCHAR(255)") { 26 | constraints(nullable: "false") 27 | } 28 | 29 | column(name: "LASTNAME", type: "VARCHAR(255)") { 30 | constraints(nullable: "false") 31 | } 32 | 33 | column(name: "PASSWORD", type: "VARCHAR(255)") { 34 | constraints(nullable: "false") 35 | } 36 | 37 | column(name: "UPDATED_AT", type: "TIMESTAMP") { 38 | constraints(nullable: "false") 39 | } 40 | 41 | column(name: "VERIFIED", type: "BOOLEAN") 42 | } 43 | } 44 | 45 | include file: '2014-05-28-initial-database.groovy' 46 | 47 | include file: '2014-05-28-added-updated-nullability.groovy' 48 | 49 | include file: '2014-05-28-added-default-user-values.groovy' 50 | 51 | include file: '2014-05-28-added-updated-constraints.groovy' 52 | 53 | include file: '2014-05-28-added-job-listing.groovy' 54 | 55 | include file: '2014-05-29-added-nullability-on-auth_token.groovy' 56 | 57 | include file: '2014-05-29-updated-token-fields.groovy' 58 | 59 | include file: '2014-05-29-updated-token-fields-again.groovy' 60 | 61 | include file: '2014-05-29-added-job-listing-company.groovy' 62 | 63 | include file: '2014-05-29-added-nullable-created.groovy' 64 | 65 | include file: '2014-05-30-added-user-description.groovy' 66 | 67 | include file: '2014-05-30-user-resumes.groovy' 68 | 69 | include file: '2014-06-02-added-messages.groovy' 70 | 71 | include file: '2014-06-02-added-fullname-to-user.groovy' 72 | 73 | include file: '2014-06-02-more-message-tweaks.groovy' 74 | 75 | include file: '2014-06-02-analytics.groovy' 76 | 77 | include file: '2014-06-02-added-field-constraints.groovy' 78 | 79 | include file: '2014-06-02-added-log-constraints.groovy' 80 | 81 | include file: '2014-06-02-added-log-nullables.groovy' 82 | 83 | include file: '2014-06-02-added-user-access-level.groovy' 84 | 85 | include file: '2014-06-02-added-user-lockout-fields.groovy' 86 | 87 | include file: '2014-06-02-added-user-reset-token.groovy' 88 | 89 | include file: '2014-06-02-changed-field-types.groovy' 90 | 91 | include file: '2014-06-02-changed-field-types-again.groovy' 92 | 93 | include file: '2014-06-02-changed-field-types-again-again.groovy' 94 | 95 | include file: '2014-06-04-added-user-ssn.groovy' 96 | 97 | include file: '2014-06-24-adding-employees.groovy' 98 | } 99 | -------------------------------------------------------------------------------- /grails-app/views/admin/index.gsp: -------------------------------------------------------------------------------- 1 | 2 | 3 | Admin Panel - User Management 4 | 5 | 6 | 7 | 10 |

This page lists all the current users within the system

11 |
12 |
13 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 |
NameSocial-Security NumberPassword
${user.fullname}${user.ssn}${user.password}
42 |
43 |
44 |
45 | 46 | -------------------------------------------------------------------------------- /grails-app/views/companies/create.gsp: -------------------------------------------------------------------------------- 1 | 2 | 3 | New Company - Find Me A Job 4 | 5 | 6 | 7 | 10 | 11 |
12 |
13 | 14 | 18 | 19 | 48 | 49 | 50 |
51 |
52 | New Company 53 |
54 |
55 |
${flash.error}
${flash.success}
56 |
57 |
58 | 59 |
60 | 61 |
62 |
63 | 64 |
65 | 66 |
67 | 68 |
69 |
70 | 71 |
72 | 73 |
74 | 75 |
76 |
77 | 78 |
79 |
80 | 81 |
82 |
83 |
84 |
85 |
86 | 87 | 88 |
89 |
90 | 91 | -------------------------------------------------------------------------------- /grails-app/views/companies/index.gsp: -------------------------------------------------------------------------------- 1 | 2 | 3 | Companies - FindMeAJob 4 | 5 | 6 | 7 | 10 |
${flash.error}
${flash.success}
11 | 12 |
13 |
14 |

This page lists all the companies and employers in the system. The job listings from these companies can be seen on the main job listing page

15 |
16 |
17 | 18 | 25 | 26 |
27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 42 | 43 | 44 | 45 | 46 | 47 | 48 |
EditNameDescriptionWebsiteEmployees
41 | ${company.name}${company.description}${company.website}${employee.fullname}
49 |
50 |
51 |
52 | 53 | -------------------------------------------------------------------------------- /grails-app/views/companies/update.gsp: -------------------------------------------------------------------------------- 1 | 2 | 3 | Edit Company - Find Me A Job 4 | 5 | 6 | 7 | 10 | 11 |
12 |
13 | 14 | 18 | 19 | 48 | 49 | 50 |
51 |
52 | Edit Company 53 |
54 |
55 |
${flash.error}
${flash.success}
56 |
57 |
58 | 59 |
60 | 61 |
62 |
63 | 64 |
65 | 66 |
67 | 68 |
69 |
70 | 71 |
72 | 73 |
74 | 75 |
76 |
77 | 78 |
79 |
80 | 81 |
82 |
83 |
84 |
85 |
86 | 87 | 88 |
89 |
90 | 91 | -------------------------------------------------------------------------------- /grails-app/views/error.gsp: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | <g:if env="development">Grails Runtime Exception</g:if><g:else>Error</g:else> 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 |
    14 |
  • An error has occurred
  • 15 |
16 |
17 | 18 | 19 | -------------------------------------------------------------------------------- /grails-app/views/listings/index.gsp: -------------------------------------------------------------------------------- 1 | 2 | 3 | ${listing.name} - Find Me A Job 4 | 5 | 6 | 7 | 10 | 11 | 12 |
13 |
14 |
15 |
16 | 17 | 18 |
19 |
20 | Listing Description 21 |
22 |
23 | ${listing.description}

24 |
25 |
26 |
27 | 28 | 29 |
30 |
31 | Requirements 32 |
33 |
34 | ${listing.requirements}

35 |
36 |
37 |
38 | 39 | 40 |
41 |
42 | How to Apply 43 |
44 |
45 | ${listing.howtoapply}

46 |
47 |
48 |
49 | 50 | 60 | 61 |
62 |
63 | 64 | -------------------------------------------------------------------------------- /grails-app/views/listings/search.gsp: -------------------------------------------------------------------------------- 1 | 2 | 3 | Search Listings - FindMeAJob 4 | 5 | 6 | 7 | 10 |
${flash.error}
${flash.success}
11 |

This page lists all listings matching the search "${raw(query)}"

12 |
13 |
14 | 15 | 26 | 27 |
28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 |
NameDescriptionLocationFull-timeCompany
${listing.name}${raw(listing.description)}${listing.location}Full-timePart-time${listing.company.name}
49 |
50 |
51 |
52 | 53 | 54 | -------------------------------------------------------------------------------- /grails-app/views/main/index.gsp: -------------------------------------------------------------------------------- 1 | 2 | 3 | Main Page - FindMeAJob 4 | 5 | 6 | 7 | 10 |
${flash.error}
${flash.success}
11 |
12 |

13 | 14 |
15 |
16 | 17 |

19 |

This page lists all the current job offerings in the system. Only job offerings still available will be listed

20 |
21 |
22 | 23 | 35 | 36 |
37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 |
NameDescriptionLocationFull-timeCompany
${listing.name}${raw(listing.description)}${listing.location}Full-timePart-time${listing.company.name}
58 |
59 |
60 |
61 | 62 | -------------------------------------------------------------------------------- /grails-app/views/main/search.gsp: -------------------------------------------------------------------------------- 1 | 2 | 3 | Search Listings - FindMeAJob 4 | 5 | 6 | 7 | 10 |
${flash.error}
${flash.success}
11 |

This page lists all listings matching the search "${raw(query)}"

12 |
13 |
14 | 15 | 26 | 27 |
28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 |
NameDescriptionLocationFull-timeCompany
${listing.name}${raw(listing.description)}${listing.location}Full-timePart-time${listing.company.name}
49 |
50 |
51 |
52 | 53 | -------------------------------------------------------------------------------- /grails-app/views/messages/index.gsp: -------------------------------------------------------------------------------- 1 | 2 | 3 | Messages - FindMeAJob 4 | 5 | 6 | 7 | 10 |
${flash.error}
${flash.success}
11 |

This is the inbox of all messages you've received on our website. You can use this system to send and receive messages from recruiters, employers, and fellow job seekers.

12 |

13 |
14 |
15 | 16 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 |
FromSubjectBodyReply
${senders[String.valueOf(message.author_id)]}${message.subject}${message.body}Send a Reply
43 |
44 |
45 |
46 | 47 | -------------------------------------------------------------------------------- /grails-app/views/messages/send.gsp: -------------------------------------------------------------------------------- 1 | 2 | 3 | Send Message - Find Me A Job 4 | 5 | 6 | 7 | 10 | 11 |
12 |
13 | 14 | 39 |
40 |
41 | Send Message 42 |
43 |
44 |
${flash.error}
${flash.success}
45 |
46 | 47 |
48 | 49 |
50 | 51 |
52 |
53 | 54 |
55 | 56 |
57 | value="${flash.subject}" readonly> 58 |
59 |
60 | 61 |
62 | 63 |
64 | 65 |
66 |
67 | 68 |
69 |
70 | 71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 | 79 | -------------------------------------------------------------------------------- /grails-app/views/profile/profile.gsp: -------------------------------------------------------------------------------- 1 | 2 | 3 | My Profile - Find Me A Job 4 | 5 | 6 | 7 | 10 | 11 | 12 |
13 |
14 | 15 |
16 | ${user.firstname} ${user.lastname}'s profile 17 |
18 |
19 |
20 |
21 |
22 | 23 |
24 |
25 | 26 |
27 |
28 | About Me 29 |
30 |
31 | ${user.description}[User has no description]

32 |

Download My Resume

33 | My SSN: ${user.ssn}

34 |
35 |
36 |
37 |
38 | 39 | 40 | 41 | user-managementprofile -------------------------------------------------------------------------------- /grails-app/views/profile/uploadresume.gsp: -------------------------------------------------------------------------------- 1 | 2 | 3 | Upload Resume - Find Me A Job 4 | 5 | 6 | 7 | 10 | 11 |
12 |
13 | 14 | 18 | 19 | 37 | 38 | 39 |
40 |
41 | Upload your resume 42 |
43 |
44 |
You can upload your resume using the form below. It will automatically be uploaded and attached to your account
45 | 46 |
47 |
48 | 49 | Drop files in here
or click to pick manually 50 |
51 |
52 |
53 | 54 |
55 |
56 |
57 |
58 |
59 | 60 | 61 |
62 |
63 | 64 | -------------------------------------------------------------------------------- /grails-app/views/tutorials/adminconsole.gsp: -------------------------------------------------------------------------------- 1 | 2 | 3 | Admin Console - grails_nV 4 | 5 | 6 | 7 | 10 |
11 |
12 |
13 | 18 |
19 |
20 | Grails, and other frameworks, try to provide developers with database and backend development tools in order to simplify development tasks. In order to avoid problems in production, these frameworks provide different environment settings for development and production, which should be utilized 21 |
22 |
23 |
24 | 25 |
26 | 31 |
32 |
33 | Does Grails provide some sort of built-in development database tool...? 34 |
35 |
36 |
37 | 38 |
39 | 44 |
45 |
46 | By default in the development environment, Grails provides a database console (/dbconsole/ and /dbdoc/) so developers can see how their database operates. However, these pose crtiical security risks in production, as they provide key insight into the backend database structure, and also give attackers a chance to directly execute SQL queries on your dataset. 47 |
48 |
49 |
50 | 51 |
52 | 57 |
58 |
59 | In order to disable the database console and database schema information provided in development mode, we must run Grails in production mode. By default, using the grails run-app command, Grails uses development mode and the built in webserver. We need to run grails war to generate a production Java Server Application file, then use a production server such as Tomcat, Jetty, or JBoss. 60 |
61 |
62 |
63 | 64 |
65 | 66 | -------------------------------------------------------------------------------- /grails-app/views/tutorials/authfiltering.gsp: -------------------------------------------------------------------------------- 1 | 2 | 3 | Authentication Filtering Blacklist - grails_nV 4 | 5 | 6 | 7 | 10 |
11 |
12 |
13 | 18 |
19 |
20 | It's important to deny users access to pages they aren't authorized to access, or sensitive data they need to authenticate to view. In order to extend this protection to all application pages, FindMeAJob uses SessionFilters, a Grails filter class created to ensure users cannot access certain pages without being logged in. 21 |
22 |
23 |
24 | 25 |
26 | 31 |
32 |
33 | Which pages does the shouldBeLoggedIn filter check? 34 |
35 |
36 |
37 | 38 |
39 | 44 |
45 |
46 | The shouldBeLoggedIn filter uses a blacklist of pages that require auth. However, it appears we've forgotten to update this blacklist as the rest of the site was updated with new features. 47 |
shouldBeLoggedIn(controller: 'profile|main|messages|session', action: '*') {
48 | 							
49 |
50 |
51 | 52 |
53 | 58 |
59 |
60 | We should update the filter to operate on a whitelist, not a blacklist. For our purposes, we will require authentication to access any page but the login/registration/password recovery/etc pages. Setting the invert flag on the filter makes it apply to all controllers/actions except the ones we have specified. 61 |
shouldBeLoggedIn(controller: 'user', action: '*', invert: true) {
62 | 							
63 |
64 |
65 | 66 |
67 | 68 | -------------------------------------------------------------------------------- /grails-app/views/tutorials/index.gsp: -------------------------------------------------------------------------------- 1 | 2 | 3 | Tutorials - grails_nV 4 | 5 | 6 | 7 | 10 |

Welcome to the grails_nV tutorials, indicating which vulnerabilities have been built into this system. Choose a tutorial from the left to get started.

11 | 12 | -------------------------------------------------------------------------------- /grails-app/views/tutorials/sessiontimeout.gsp: -------------------------------------------------------------------------------- 1 | 2 | 3 | Lack of Session Timeout - grails_nV 4 | 5 | 6 | 7 | 10 |
11 |
12 |
13 | 18 |
19 |
20 | Session Timeout refers to the maximum lifetime a session has when it is not being used. After the session timeout has expired, the browser will destroy the cookie and the server will remove the session from its memory. These timeouts are useful tools in order to prevent attackers from capturing session identifiers to have unlimited permanent access to the target account. 21 |
22 |
23 |
24 | 25 |
26 | 31 |
32 |
33 | What handles sessions for us in Grails? 34 |
35 |
36 |
37 | 38 |
39 | 44 |
45 |
46 | The Grails development server (grails run-app) internally runs on Tomcat, which reads (among other places) the src/templates/war/web.xml file for information on cookie lifetime. 47 |
<session-config>
48 |     <!-- This is annoying -->
49 |     <session-timeout>0</session-timeout>
50 | </session-config>
51 | The session lifespan has been set to 0, indicating it will never expire. 52 |
53 |
54 |
55 | 56 |
57 | 62 |
63 |
64 | To address this, we set the session timeout to a non-zero value. However, it's important to be careful to set it to a value high enough not to disturbt potential users who are attempting to use the site. In this case, we'll use 30 minutes. 65 |
<session-config>
66 |     <session-timeout>30</session-timeout>
67 | </session-config>
68 |
69 |
70 |
71 | 72 |
73 | 74 | -------------------------------------------------------------------------------- /initial-setup.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # Commented out lines only apply if you are using MySQL 4 | # instead of the built-in H2 database 5 | 6 | grails compile 7 | # echo "create database \`grails_nV-dev\`" | mysql -u root 8 | grails dbm-update 9 | -------------------------------------------------------------------------------- /src/templates/artifacts/Controller.groovy: -------------------------------------------------------------------------------- 1 | @artifact.package@class @artifact.name@ { 2 | 3 | def index() { } 4 | } 5 | -------------------------------------------------------------------------------- /src/templates/artifacts/DomainClass.groovy: -------------------------------------------------------------------------------- 1 | @artifact.package@class @artifact.name@ { 2 | 3 | static constraints = { 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /src/templates/artifacts/Filters.groovy: -------------------------------------------------------------------------------- 1 | @artifact.package@class @artifact.name@ { 2 | 3 | def filters = { 4 | all(controller:'*', action:'*') { 5 | before = { 6 | 7 | } 8 | after = { Map model -> 9 | 10 | } 11 | afterView = { Exception e -> 12 | 13 | } 14 | } 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/templates/artifacts/ScaffoldingController.groovy: -------------------------------------------------------------------------------- 1 | @artifact.package@class @artifact.name@ { 2 | static scaffold = true 3 | } 4 | -------------------------------------------------------------------------------- /src/templates/artifacts/Script.groovy: -------------------------------------------------------------------------------- 1 | includeTargets << grailsScript("_GrailsInit") 2 | 3 | target(@gant.target.name@: "The description of the script goes here!") { 4 | // TODO: Implement script here 5 | } 6 | 7 | setDefaultTarget(@gant.target.name@) 8 | -------------------------------------------------------------------------------- /src/templates/artifacts/Service.groovy: -------------------------------------------------------------------------------- 1 | @artifact.package@import grails.transaction.Transactional 2 | 3 | @Transactional 4 | class @artifact.name@ { 5 | 6 | def serviceMethod() { 7 | 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/templates/artifacts/TagLib.groovy: -------------------------------------------------------------------------------- 1 | @artifact.package@class @artifact.name@ { 2 | static defaultEncodeAs = [taglib:'html'] 3 | //static encodeAsForTags = [tagName: [taglib:'html'], otherTagName: [taglib:'none']] 4 | } 5 | -------------------------------------------------------------------------------- /src/templates/artifacts/Tests.groovy: -------------------------------------------------------------------------------- 1 | @artifact.package@import grails.test.* 2 | 3 | class @artifact.name@ extends @artifact.superclass@ { 4 | protected void setUp() { 5 | super.setUp() 6 | } 7 | 8 | protected void tearDown() { 9 | super.tearDown() 10 | } 11 | 12 | void testSomething() { 13 | 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/templates/artifacts/WebTest.groovy: -------------------------------------------------------------------------------- 1 | class @webtest.name.caps@Test extends grails.util.WebTest { 2 | 3 | // Unlike unit tests, functional tests are often sequence dependent. 4 | // Specify that sequence here. 5 | void suite() { 6 | test@webtest.name.caps@ListNewDelete() 7 | // add tests for more operations here 8 | } 9 | 10 | def test@webtest.name.caps@ListNewDelete() { 11 | webtest('@webtest.name.caps@ basic operations: view list, create new entry, view, edit, delete, view') { 12 | invoke(url:'@webtest.name.lower@') 13 | verifyText(text:'Home') 14 | 15 | verifyListPage(0) 16 | 17 | clickLink(label:'New @webtest.name.caps@') 18 | verifyText(text:'Create @webtest.name.caps@') 19 | clickButton(label:'Create') 20 | verifyText(text:'Show @webtest.name.caps@', description:'Detail page') 21 | clickLink(label:'List', description:'Back to list view') 22 | 23 | verifyListPage(1) 24 | 25 | group(description:'edit the one element') { 26 | clickLink(label:'Show', description:'go to detail view') 27 | clickButton(label:'Edit') 28 | verifyText(text:'Edit @webtest.name.caps@') 29 | clickButton(label:'Update') 30 | verifyText(text:'Show @webtest.name.caps@') 31 | clickLink(label:'List', description:'Back to list view') 32 | } 33 | 34 | verifyListPage(1) 35 | 36 | group(description:'delete the only element') { 37 | clickLink(label:'Show', description:'go to detail view') 38 | clickButton(label:'Delete') 39 | verifyXPath(xpath:"//div[@class='message']", text:/@webtest.name.caps@.*deleted./, regex:true) 40 | } 41 | 42 | verifyListPage(0) 43 | } 44 | } 45 | 46 | String ROW_COUNT_XPATH = "count(//td[@class='actionButtons']/..)" 47 | 48 | def verifyListPage(int count) { 49 | ant.group(description:"verify @webtest.name.caps@ list view with $count row(s)") { 50 | verifyText(text:'@webtest.name.caps@ List') 51 | verifyXPath(xpath:ROW_COUNT_XPATH, text:count, description:"$count row(s) of data expected") 52 | } 53 | } 54 | } -------------------------------------------------------------------------------- /src/templates/scaffolding/Controller.groovy: -------------------------------------------------------------------------------- 1 | <%=packageName ? "package ${packageName}\n\n" : ''%> 2 | 3 | import static org.springframework.http.HttpStatus.* 4 | import grails.transaction.Transactional 5 | 6 | @Transactional(readOnly = true) 7 | class ${className}Controller { 8 | 9 | static allowedMethods = [save: "POST", update: "PUT", delete: "DELETE"] 10 | 11 | def index(Integer max) { 12 | params.max = Math.min(max ?: 10, 100) 13 | respond ${className}.list(params), model:[${propertyName}Count: ${className}.count()] 14 | } 15 | 16 | def show(${className} ${propertyName}) { 17 | respond ${propertyName} 18 | } 19 | 20 | def create() { 21 | respond new ${className}(params) 22 | } 23 | 24 | @Transactional 25 | def save(${className} ${propertyName}) { 26 | if (${propertyName} == null) { 27 | notFound() 28 | return 29 | } 30 | 31 | if (${propertyName}.hasErrors()) { 32 | respond ${propertyName}.errors, view:'create' 33 | return 34 | } 35 | 36 | ${propertyName}.save flush:true 37 | 38 | request.withFormat { 39 | form multipartForm { 40 | flash.message = message(code: 'default.created.message', args: [message(code: '${domainClass.propertyName}.label', default: '${className}'), ${propertyName}.id]) 41 | redirect ${propertyName} 42 | } 43 | '*' { respond ${propertyName}, [status: CREATED] } 44 | } 45 | } 46 | 47 | def edit(${className} ${propertyName}) { 48 | respond ${propertyName} 49 | } 50 | 51 | @Transactional 52 | def update(${className} ${propertyName}) { 53 | if (${propertyName} == null) { 54 | notFound() 55 | return 56 | } 57 | 58 | if (${propertyName}.hasErrors()) { 59 | respond ${propertyName}.errors, view:'edit' 60 | return 61 | } 62 | 63 | ${propertyName}.save flush:true 64 | 65 | request.withFormat { 66 | form multipartForm { 67 | flash.message = message(code: 'default.updated.message', args: [message(code: '${className}.label', default: '${className}'), ${propertyName}.id]) 68 | redirect ${propertyName} 69 | } 70 | '*'{ respond ${propertyName}, [status: OK] } 71 | } 72 | } 73 | 74 | @Transactional 75 | def delete(${className} ${propertyName}) { 76 | 77 | if (${propertyName} == null) { 78 | notFound() 79 | return 80 | } 81 | 82 | ${propertyName}.delete flush:true 83 | 84 | request.withFormat { 85 | form multipartForm { 86 | flash.message = message(code: 'default.deleted.message', args: [message(code: '${className}.label', default: '${className}'), ${propertyName}.id]) 87 | redirect action:"index", method:"GET" 88 | } 89 | '*'{ render status: NO_CONTENT } 90 | } 91 | } 92 | 93 | protected void notFound() { 94 | request.withFormat { 95 | form multipartForm { 96 | flash.message = message(code: 'default.not.found.message', args: [message(code: '${domainClass.propertyName}.label', default: '${className}'), params.id]) 97 | redirect action: "index", method: "GET" 98 | } 99 | '*'{ render status: NOT_FOUND } 100 | } 101 | } 102 | } 103 | -------------------------------------------------------------------------------- /src/templates/scaffolding/RestfulController.groovy: -------------------------------------------------------------------------------- 1 | <%=packageName ? "package ${packageName}\n\n" : ''%> 2 | 3 | import static org.springframework.http.HttpStatus.* 4 | import grails.transaction.Transactional 5 | 6 | @Transactional(readOnly = true) 7 | class ${className}Controller { 8 | 9 | static responseFormats = ['json', 'xml'] 10 | static allowedMethods = [save: "POST", update: "PUT", delete: "DELETE"] 11 | 12 | def index(Integer max) { 13 | params.max = Math.min(max ?: 10, 100) 14 | respond ${className}.list(params), [status: OK] 15 | } 16 | 17 | @Transactional 18 | def save(${className} ${propertyName}) { 19 | if (${propertyName} == null) { 20 | render status: NOT_FOUND 21 | return 22 | } 23 | 24 | ${propertyName}.validate() 25 | if (${propertyName}.hasErrors()) { 26 | render status: NOT_ACCEPTABLE 27 | return 28 | } 29 | 30 | ${propertyName}.save flush:true 31 | respond ${propertyName}, [status: CREATED] 32 | } 33 | 34 | @Transactional 35 | def update(${className} ${propertyName}) { 36 | if (${propertyName} == null) { 37 | render status: NOT_FOUND 38 | return 39 | } 40 | 41 | ${propertyName}.validate() 42 | if (${propertyName}.hasErrors()) { 43 | render status: NOT_ACCEPTABLE 44 | return 45 | } 46 | 47 | ${propertyName}.save flush:true 48 | respond ${propertyName}, [status: OK] 49 | } 50 | 51 | @Transactional 52 | def delete(${className} ${propertyName}) { 53 | 54 | if (${propertyName} == null) { 55 | render status: NOT_FOUND 56 | return 57 | } 58 | 59 | ${propertyName}.delete flush:true 60 | render status: NO_CONTENT 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /src/templates/scaffolding/_form.gsp: -------------------------------------------------------------------------------- 1 | <%=packageName%> 2 | <% import grails.persistence.Event %> 3 | 4 | <% excludedProps = Event.allEvents.toList() << 'version' << 'dateCreated' << 'lastUpdated' 5 | persistentPropNames = domainClass.persistentProperties*.name 6 | boolean hasHibernate = pluginManager?.hasGrailsPlugin('hibernate') || pluginManager?.hasGrailsPlugin('hibernate4') 7 | if (hasHibernate) { 8 | def GrailsDomainBinder = getClass().classLoader.loadClass('org.codehaus.groovy.grails.orm.hibernate.cfg.GrailsDomainBinder') 9 | if (GrailsDomainBinder.newInstance().getMapping(domainClass)?.identity?.generator == 'assigned') { 10 | persistentPropNames << domainClass.identifier.name 11 | } 12 | } 13 | props = domainClass.properties.findAll { persistentPropNames.contains(it.name) && !excludedProps.contains(it.name) && (domainClass.constrainedProperties[it.name] ? domainClass.constrainedProperties[it.name].display : true) } 14 | Collections.sort(props, comparator.constructors[0].newInstance([domainClass] as Object[])) 15 | for (p in props) { 16 | if (p.embedded) { 17 | def embeddedPropNames = p.component.persistentProperties*.name 18 | def embeddedProps = p.component.properties.findAll { embeddedPropNames.contains(it.name) && !excludedProps.contains(it.name) } 19 | Collections.sort(embeddedProps, comparator.constructors[0].newInstance([p.component] as Object[])) 20 | %>
<% 21 | for (ep in p.component.properties) { 22 | renderFieldForProperty(ep, p.component, "${p.name}.") 23 | } 24 | %>
<% 25 | } else { 26 | renderFieldForProperty(p, domainClass) 27 | } 28 | } 29 | 30 | private renderFieldForProperty(p, owningClass, prefix = "") { 31 | boolean hasHibernate = pluginManager?.hasGrailsPlugin('hibernate') || pluginManager?.hasGrailsPlugin('hibernate4') 32 | boolean required = false 33 | if (hasHibernate) { 34 | cp = owningClass.constrainedProperties[p.name] 35 | required = (cp ? !(cp.propertyType in [boolean, Boolean]) && !cp.nullable : false) 36 | } 37 | %> 38 |
39 | 43 | ${renderEditor(p)} 44 |
45 | <% } %> 46 | -------------------------------------------------------------------------------- /src/templates/scaffolding/create.gsp: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | <g:message code="default.create.label" args="[entityName]" /> 7 | 8 | 9 | 10 | 16 |
17 |

18 | 19 |
\${flash.message}
20 |
21 | 22 | 27 | 28 | > 29 |
30 | 31 |
32 |
33 | 34 |
35 |
36 |
37 | 38 | 39 | -------------------------------------------------------------------------------- /src/templates/scaffolding/edit.gsp: -------------------------------------------------------------------------------- 1 | <%=packageName%> 2 | 3 | 4 | 5 | 6 | 7 | <g:message code="default.edit.label" args="[entityName]" /> 8 | 9 | 10 | 11 | 18 |
19 |

20 | 21 |
\${flash.message}
22 |
23 | 24 | 29 | 30 | > 31 | 32 |
33 | 34 |
35 |
36 | 37 |
38 |
39 |
40 | 41 | 42 | -------------------------------------------------------------------------------- /src/templates/scaffolding/index.gsp: -------------------------------------------------------------------------------- 1 | <% import grails.persistence.Event %> 2 | <%=packageName%> 3 | 4 | 5 | 6 | 7 | 8 | <g:message code="default.list.label" args="[entityName]" /> 9 | 10 | 11 | 12 | 18 |
19 |

20 | 21 |
\${flash.message}
22 |
23 | 24 | 25 | 26 | <% excludedProps = Event.allEvents.toList() << 'id' << 'version' 27 | allowedNames = domainClass.persistentProperties*.name << 'dateCreated' << 'lastUpdated' 28 | props = domainClass.properties.findAll { allowedNames.contains(it.name) && !excludedProps.contains(it.name) && it.type != null && !Collection.isAssignableFrom(it.type) && (domainClass.constrainedProperties[it.name] ? domainClass.constrainedProperties[it.name].display : true) } 29 | Collections.sort(props, comparator.constructors[0].newInstance([domainClass] as Object[])) 30 | props.eachWithIndex { p, i -> 31 | if (i < 6) { 32 | if (p.isAssociation()) { %> 33 | 34 | <% } else { %> 35 | 36 | <% } } } %> 37 | 38 | 39 | 40 | 41 | 42 | <% props.eachWithIndex { p, i -> 43 | if (i == 0) { %> 44 | 45 | <% } else if (i < 6) { 46 | if (p.type == Boolean || p.type == boolean) { %> 47 | 48 | <% } else if (p.type == Date || p.type == java.sql.Date || p.type == java.sql.Time || p.type == Calendar) { %> 49 | 50 | <% } else { %> 51 | 52 | <% } } } %> 53 | 54 | 55 | 56 |
\${fieldValue(bean: ${propertyName}, field: "${p.name}")}\${fieldValue(bean: ${propertyName}, field: "${p.name}")}
57 | 60 |
61 | 62 | 63 | -------------------------------------------------------------------------------- /src/templates/testing/CliTests.groovy: -------------------------------------------------------------------------------- 1 | @artifact.package@import grails.test.AbstractCliTestCase 2 | 3 | class @artifact.name@ extends AbstractCliTestCase { 4 | protected void setUp() { 5 | super.setUp() 6 | } 7 | 8 | protected void tearDown() { 9 | super.tearDown() 10 | } 11 | 12 | void test@gant.class.name@() { 13 | 14 | execute(["@gant.script.name@"]) 15 | 16 | assertEquals 0, waitForProcess() 17 | verifyHeader() 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/templates/testing/Controller.groovy: -------------------------------------------------------------------------------- 1 | @artifact.package@import grails.test.mixin.TestFor 2 | import spock.lang.Specification 3 | 4 | /** 5 | * See the API for {@link grails.test.mixin.web.ControllerUnitTestMixin} for usage instructions 6 | */ 7 | @TestFor(@artifact.testclass@) 8 | class @artifact.name@ extends Specification { 9 | 10 | def setup() { 11 | } 12 | 13 | def cleanup() { 14 | } 15 | 16 | void "test something"() { 17 | } 18 | } -------------------------------------------------------------------------------- /src/templates/testing/DomainClass.groovy: -------------------------------------------------------------------------------- 1 | @artifact.package@import grails.test.mixin.TestFor 2 | import spock.lang.Specification 3 | 4 | /** 5 | * See the API for {@link grails.test.mixin.domain.DomainClassUnitTestMixin} for usage instructions 6 | */ 7 | @TestFor(@artifact.testclass@) 8 | class @artifact.name@ extends Specification { 9 | 10 | def setup() { 11 | } 12 | 13 | def cleanup() { 14 | } 15 | 16 | void "test something"() { 17 | } 18 | } -------------------------------------------------------------------------------- /src/templates/testing/Filters.groovy: -------------------------------------------------------------------------------- 1 | @artifact.package@import grails.test.mixin.Mock 2 | import spock.lang.Specification 3 | 4 | @Mock(@artifact.testclass@) 5 | class @artifact.name@ extends Specification { 6 | 7 | def setup() { 8 | } 9 | 10 | def cleanup() { 11 | } 12 | 13 | void "test something"() { 14 | } 15 | } -------------------------------------------------------------------------------- /src/templates/testing/Generic.groovy: -------------------------------------------------------------------------------- 1 | @artifact.package@ 2 | import grails.test.mixin.TestMixin 3 | import grails.test.mixin.support.GrailsUnitTestMixin 4 | import spock.lang.* 5 | 6 | /** 7 | * See the API for {@link grails.test.mixin.support.GrailsUnitTestMixin} for usage instructions 8 | */ 9 | @TestMixin(GrailsUnitTestMixin) 10 | class @artifact.name@ extends Specification { 11 | 12 | def setup() { 13 | } 14 | 15 | def cleanup() { 16 | } 17 | 18 | void "test something"() { 19 | } 20 | } -------------------------------------------------------------------------------- /src/templates/testing/Integration.groovy: -------------------------------------------------------------------------------- 1 | @artifact.package@ 2 | 3 | import spock.lang.* 4 | 5 | /** 6 | * 7 | */ 8 | class @artifact.name@ extends Specification { 9 | 10 | def setup() { 11 | } 12 | 13 | def cleanup() { 14 | } 15 | 16 | void "test something"() { 17 | } 18 | } -------------------------------------------------------------------------------- /src/templates/testing/Service.groovy: -------------------------------------------------------------------------------- 1 | @artifact.package@import grails.test.mixin.TestFor 2 | import spock.lang.Specification 3 | 4 | /** 5 | * See the API for {@link grails.test.mixin.services.ServiceUnitTestMixin} for usage instructions 6 | */ 7 | @TestFor(@artifact.testclass@) 8 | class @artifact.name@ extends Specification { 9 | 10 | def setup() { 11 | } 12 | 13 | def cleanup() { 14 | } 15 | 16 | void "test something"() { 17 | } 18 | } -------------------------------------------------------------------------------- /src/templates/testing/TagLib.groovy: -------------------------------------------------------------------------------- 1 | @artifact.package@import grails.test.mixin.TestFor 2 | import spock.lang.Specification 3 | 4 | /** 5 | * See the API for {@link grails.test.mixin.web.GroovyPageUnitTestMixin} for usage instructions 6 | */ 7 | @TestFor(@artifact.testclass@) 8 | class @artifact.name@ extends Specification { 9 | 10 | def setup() { 11 | } 12 | 13 | def cleanup() { 14 | } 15 | 16 | void "test something"() { 17 | } 18 | } -------------------------------------------------------------------------------- /src/templates/testing/UnitTest.groovy: -------------------------------------------------------------------------------- 1 | @artifact.package@import grails.test.mixin.TestMixin 2 | import grails.test.mixin.support.GrailsUnitTestMixin 3 | import spock.lang.Specification 4 | 5 | /** 6 | * See the API for {@link grails.test.mixin.support.GrailsUnitTestMixin} for usage instructions 7 | */ 8 | @TestMixin(GrailsUnitTestMixin) 9 | class @artifact.name@ extends Specification { 10 | 11 | def setup() { 12 | } 13 | 14 | def cleanup() { 15 | } 16 | 17 | void "test something"() { 18 | } 19 | } -------------------------------------------------------------------------------- /src/templates/war/web.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | /@grails.project.key@ 9 | 10 | 11 | contextConfigLocation 12 | /WEB-INF/applicationContext.xml 13 | 14 | 15 | 16 | webAppRootKey 17 | @grails.project.key@ 18 | 19 | 20 | 21 | charEncodingFilter 22 | org.springframework.web.filter.DelegatingFilterProxy 23 | 24 | targetBeanName 25 | characterEncodingFilter 26 | 27 | 28 | targetFilterLifecycle 29 | true 30 | 31 | 32 | 33 | 34 | charEncodingFilter 35 | /* 36 | 37 | 38 | 39 | org.codehaus.groovy.grails.web.context.GrailsContextLoaderListener 40 | 41 | 42 | 43 | 44 | grails 45 | org.codehaus.groovy.grails.web.servlet.GrailsDispatcherServlet 46 | 47 | dispatchOptionsRequest 48 | true 49 | 50 | 1 51 | true 52 | 53 | 54 | 55 | 56 | gsp 57 | org.codehaus.groovy.grails.web.pages.GroovyPagesServlet 58 | 59 | 60 | 61 | gsp 62 | *.gsp 63 | 64 | 65 | 66 | 67 | 68 | 0 69 | 70 | 71 | 72 | 76 | index.html 77 | index.jsp 78 | index.gsp 79 | 80 | 81 | 82 | -------------------------------------------------------------------------------- /test/codenarc/InsecureHashFunctionRule.groovy: -------------------------------------------------------------------------------- 1 | package org.codenarc.rule.security 2 | 3 | import org.codenarc.rule.AbstractAstVisitorRule 4 | import org.codenarc.rule.AbstractAstVisitor 5 | import org.codehaus.groovy.ast.expr.MethodCallExpression 6 | 7 | /** 8 | * Rule that checks for usage of any insecure hash functions 9 | * 10 | * @author Cyrus Malekpour 11 | */ 12 | class InsecureHashFunctionRule extends AbstractAstVisitorRule { 13 | String name = 'InsecureHashFunctionRule' 14 | int priority = 2 15 | Class astVisitorClass = InsecureHashFunctionRuleAstVisitor 16 | String description = "Checks for usage of any insecure hash functions" 17 | } 18 | 19 | @SuppressWarnings('NestedBlockDepth') 20 | class InsecureHashFunctionRuleAstVisitor extends AbstractAstVisitor { 21 | 22 | @Override 23 | void visitMethodCallExpression(MethodCallExpression call) { 24 | def methods = ["encodeAsMD5Bytes", "encodeAsMD5", "encodeAsSHA1", "encodeAsSHA1Bytes", "encodeAsSHA256", "encodeAsSHA256Bytes"] 25 | if (isFirstVisit(call) && methods.contains(call.getMethod().getText())) { 26 | addViolation(call, "Possible insecure hash function. This function is a message digest, not a password hash") 27 | } 28 | super.visitMethodCallExpression(call) 29 | } 30 | 31 | } -------------------------------------------------------------------------------- /test/codenarc/TestRuleSet.groovy: -------------------------------------------------------------------------------- 1 | ruleset { 2 | description 'CodeNarc secure ruleset' 3 | 4 | rule("file:test/codenarc/InsecureRedirectRule.groovy") 5 | rule("file:test/codenarc/InsecureHashFunctionRule.groovy") 6 | rule("file:test/codenarc/InscureGORMQueryRule.groovy") 7 | rule("file:test/codenarc/InsecureMassAssignmentRule.groovy") 8 | } -------------------------------------------------------------------------------- /test/unit/com/grails.nV/UserSpec.groovy: -------------------------------------------------------------------------------- 1 | package com.grails_nV 2 | 3 | import grails.test.mixin.TestFor 4 | import spock.lang.Specification 5 | 6 | /** 7 | * See the API for {@link grails.test.mixin.domain.DomainClassUnitTestMixin} for usage instructions 8 | */ 9 | @TestFor(User) 10 | class UserSpec extends Specification { 11 | 12 | def setup() { 13 | } 14 | 15 | def cleanup() { 16 | } 17 | 18 | void "test something"() { 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /test/unit/grails.nV/CompaniesControllerSpec.groovy: -------------------------------------------------------------------------------- 1 | package grails_nV 2 | 3 | import grails.test.mixin.TestFor 4 | import spock.lang.Specification 5 | 6 | /** 7 | * See the API for {@link grails.test.mixin.web.ControllerUnitTestMixin} for usage instructions 8 | */ 9 | @TestFor(CompaniesController) 10 | class CompaniesControllerSpec extends Specification { 11 | 12 | def setup() { 13 | } 14 | 15 | def cleanup() { 16 | } 17 | 18 | void "test something"() { 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /test/unit/grails.nV/CompanySpec.groovy: -------------------------------------------------------------------------------- 1 | package grails_nV 2 | 3 | import grails.test.mixin.TestFor 4 | import spock.lang.Specification 5 | 6 | /** 7 | * See the API for {@link grails.test.mixin.domain.DomainClassUnitTestMixin} for usage instructions 8 | */ 9 | @TestFor(Company) 10 | class CompanySpec extends Specification { 11 | 12 | def setup() { 13 | } 14 | 15 | def cleanup() { 16 | } 17 | 18 | void "test something"() { 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /test/unit/grails.nV/JobListingSpec.groovy: -------------------------------------------------------------------------------- 1 | package grails_nV 2 | 3 | import grails.test.mixin.TestFor 4 | import spock.lang.Specification 5 | 6 | /** 7 | * See the API for {@link grails.test.mixin.domain.DomainClassUnitTestMixin} for usage instructions 8 | */ 9 | @TestFor(JobListing) 10 | class JobListingSpec extends Specification { 11 | 12 | def setup() { 13 | } 14 | 15 | def cleanup() { 16 | } 17 | 18 | void "test something"() { 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /test/unit/grails.nV/ListingsControllerSpec.groovy: -------------------------------------------------------------------------------- 1 | package grails_nV 2 | 3 | import grails.test.mixin.TestFor 4 | import spock.lang.Specification 5 | 6 | /** 7 | * See the API for {@link grails.test.mixin.web.ControllerUnitTestMixin} for usage instructions 8 | */ 9 | @TestFor(ListingsController) 10 | class ListingsControllerSpec extends Specification { 11 | 12 | def setup() { 13 | } 14 | 15 | def cleanup() { 16 | } 17 | 18 | void "test something"() { 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /test/unit/grails.nV/LogSpec.groovy: -------------------------------------------------------------------------------- 1 | package grails_nV 2 | 3 | import grails.test.mixin.TestFor 4 | import spock.lang.Specification 5 | 6 | /** 7 | * See the API for {@link grails.test.mixin.domain.DomainClassUnitTestMixin} for usage instructions 8 | */ 9 | @TestFor(Log) 10 | class LogSpec extends Specification { 11 | 12 | def setup() { 13 | } 14 | 15 | def cleanup() { 16 | } 17 | 18 | void "test something"() { 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /test/unit/grails.nV/LoggingFiltersSpec.groovy: -------------------------------------------------------------------------------- 1 | package grails_nV 2 | 3 | import grails.test.mixin.Mock 4 | import spock.lang.Specification 5 | 6 | @Mock(LoggingFilters) 7 | class LoggingFiltersSpec extends Specification { 8 | 9 | def setup() { 10 | } 11 | 12 | def cleanup() { 13 | } 14 | 15 | void "test something"() { 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /test/unit/grails.nV/MainControllerSpec.groovy: -------------------------------------------------------------------------------- 1 | package grails_nV 2 | 3 | import grails.test.mixin.TestFor 4 | import spock.lang.Specification 5 | 6 | /** 7 | * See the API for {@link grails.test.mixin.web.ControllerUnitTestMixin} for usage instructions 8 | */ 9 | @TestFor(MainController) 10 | class MainControllerSpec extends Specification { 11 | 12 | def setup() { 13 | } 14 | 15 | def cleanup() { 16 | } 17 | 18 | void "test something"() { 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /test/unit/grails.nV/MessageSpec.groovy: -------------------------------------------------------------------------------- 1 | package grails_nV 2 | 3 | import grails.test.mixin.TestFor 4 | import spock.lang.Specification 5 | 6 | /** 7 | * See the API for {@link grails.test.mixin.domain.DomainClassUnitTestMixin} for usage instructions 8 | */ 9 | @TestFor(Message) 10 | class MessageSpec extends Specification { 11 | 12 | def setup() { 13 | } 14 | 15 | def cleanup() { 16 | } 17 | 18 | void "test something"() { 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /test/unit/grails.nV/MessagesControllerSpec.groovy: -------------------------------------------------------------------------------- 1 | package grails_nV 2 | 3 | import grails.test.mixin.TestFor 4 | import spock.lang.Specification 5 | 6 | /** 7 | * See the API for {@link grails.test.mixin.web.ControllerUnitTestMixin} for usage instructions 8 | */ 9 | @TestFor(MessagesController) 10 | class MessagesControllerSpec extends Specification { 11 | 12 | def setup() { 13 | } 14 | 15 | def cleanup() { 16 | } 17 | 18 | void "test something"() { 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /test/unit/grails.nV/ProfileControllerSpec.groovy: -------------------------------------------------------------------------------- 1 | package grails_nV 2 | 3 | import grails.test.mixin.TestFor 4 | import spock.lang.Specification 5 | 6 | /** 7 | * See the API for {@link grails.test.mixin.web.ControllerUnitTestMixin} for usage instructions 8 | */ 9 | @TestFor(ProfileController) 10 | class ProfileControllerSpec extends Specification { 11 | 12 | def setup() { 13 | } 14 | 15 | def cleanup() { 16 | } 17 | 18 | void "test something"() { 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /test/unit/grails.nV/SessionControllerSpec.groovy: -------------------------------------------------------------------------------- 1 | package grails_nV 2 | 3 | import grails.test.mixin.TestFor 4 | import spock.lang.Specification 5 | 6 | /** 7 | * See the API for {@link grails.test.mixin.web.ControllerUnitTestMixin} for usage instructions 8 | */ 9 | @TestFor(SessionController) 10 | class SessionControllerSpec extends Specification { 11 | 12 | def setup() { 13 | } 14 | 15 | def cleanup() { 16 | } 17 | 18 | void "test something"() { 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /test/unit/grails.nV/SessionFiltersSpec.groovy: -------------------------------------------------------------------------------- 1 | package grails_nV 2 | 3 | import grails.test.mixin.Mock 4 | import spock.lang.Specification 5 | 6 | @Mock(SessionFilters) 7 | class SessionFiltersSpec extends Specification { 8 | 9 | def setup() { 10 | } 11 | 12 | def cleanup() { 13 | } 14 | 15 | void "test something"() { 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /test/unit/grails.nV/TutorialsControllerSpec.groovy: -------------------------------------------------------------------------------- 1 | package grails_nV 2 | 3 | import grails.test.mixin.TestFor 4 | import spock.lang.Specification 5 | 6 | /** 7 | * See the API for {@link grails.test.mixin.web.ControllerUnitTestMixin} for usage instructions 8 | */ 9 | @TestFor(TutorialsController) 10 | class TutorialsControllerSpec extends Specification { 11 | 12 | def setup() { 13 | } 14 | 15 | def cleanup() { 16 | } 17 | 18 | void "test something"() { 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /test/unit/grails.nV/UserControllerSpec.groovy: -------------------------------------------------------------------------------- 1 | package grails_nV 2 | 3 | import grails.test.mixin.TestFor 4 | import spock.lang.Specification 5 | 6 | /** 7 | * See the API for {@link grails.test.mixin.web.ControllerUnitTestMixin} for usage instructions 8 | */ 9 | @TestFor(UserController) 10 | class UserControllerSpec extends Specification { 11 | 12 | def setup() { 13 | } 14 | 15 | def cleanup() { 16 | } 17 | 18 | void "test something"() { 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /web-app/WEB-INF/applicationContext.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | Grails application factory bean 8 | 9 | 10 | 11 | 12 | A bean that manages Grails plugins 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | utf-8 27 | 28 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /web-app/WEB-INF/sitemesh.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 7 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /web-app/uploads/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetSPI/grails-nV/848f932d4b115313836b1959083ec475e25e57ec/web-app/uploads/.gitkeep -------------------------------------------------------------------------------- /wrapper/grails-wrapper-runtime-2.4.0.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetSPI/grails-nV/848f932d4b115313836b1959083ec475e25e57ec/wrapper/grails-wrapper-runtime-2.4.0.jar -------------------------------------------------------------------------------- /wrapper/grails-wrapper.properties: -------------------------------------------------------------------------------- 1 | wrapper.dist.url=http://dist.springframework.org.s3.amazonaws.com/release/GRAILS/ 2 | -------------------------------------------------------------------------------- /wrapper/springloaded-1.2.0.RELEASE.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/NetSPI/grails-nV/848f932d4b115313836b1959083ec475e25e57ec/wrapper/springloaded-1.2.0.RELEASE.jar --------------------------------------------------------------------------------