Tynamo is model-driven, full-stack web framework based on Tapestry 5.
Tynamo's mission is to provide implementations for different aspects of a full web application stack that offer reasonable out-of-the-box functionality and are easy to customize. We are intent on proving that web applications based on Java can simultaneously be high performing, easy to implement and fun to develop. We leverage existing technologies where possible and provide integrations with proven, clean and compact libraries rather than limit ourselves only to standard Java (JSRs). Tynamo is both comprehensive and modular so you are free to choose the parts you like from our full stack. And finally, we like Tapestry and our modules use Tapestry IoC extensively.
| Quick status update Prepare for an onslaught of new releases supporting Tapestry 5.3! Check out our latest module, tapestry-jdo. |
Latest news
We picked up the brand new Apache Shiro 1.2.0 release of which development snapshots we've been running against for months now. We also decided it's time to start eating our own dog food, so we delegated tapestry-security's exception handling to another module from tynamo.org, tapestry-exceptionpage, in order to gracefully handle security responses as redirects, ajax or not. Read more about what tapestry-security can do for you from tapestry-security guide. Special thanks to Lenny Primak for relentlessly bugging us until we just had to get the 0.4.1 out the door ![]()
Release notes:
Bug
- [TYNAMO-102] - Specify id for RequestExceptionHandler advice for preventing unintentional override
- [TYNAMO-103] - @Security, tapestry.secure-enabled, MetaDataConstants.SECURE_PAGE not honored by Tapestry security
- [TYNAMO-105] - Warning is issued in the log file on every startup
Improvement
- [TYNAMO-87] - Redirects should honor localization
- [TYNAMO-106] - Login screen background file (login-bg.png) is too large for the web - smaller file attached
- [TYNAMO-109] - Allow Unauthorized and Login page to be a single page
- [TYNAMO-110] - redirect to login page for pages secured with @RequiresXXX annotations
- [TYNAMO-113] - Test for ajax in the AccessControlFilter.issueRedirect and issue a client-side "soft" redirect if so
- [TYNAMO-117] - Add symbol for disabling redirect to saved request
- [TYNAMO-118] - Store savedrequest into a cookie instead of session
- [TYNAMO-119] - In SecurityFilterChainFactoryImpl, use componentClassResolver to resolve pageclasses to urls
New Feature
- [TYNAMO-111] - Add support for SslFilter & PortFilter
Bug
- [TYNAMO-97] - tynamo-exceptionpage doesn't handle operationexceptions
Improvement
- [TYNAMO-112] - Properly handle ajax "redirects"
- [TYNAMO-114] - Improve exception cause handling and documentation
This module has been a long time in the making - the initial commit of the basic functionality was added about 6 months ago when I had just finished working on a JDO based app running on Google App Engine. The module was inspired by the tapestry-jpa module at Tynamo.
JDO as a standard is a curious beast. It was the first attempt at building solid ORM functionality for the Java platform, there were a bunch of solid implementations out there (Apache JDO, Kodo, etc); however, it somehow never managed to catch fire like Hibernate. For a while, at least for me, it felt like the standard was on its way out, giving way to JPA; yet, it keeps coming back: Google App Engine JDO support, MongoDB JDO API through DataNucleus, etc.
Enjoy !
Release notes:
Improvement
TYNAMO-67 - Allow contributing new security filters
New Feature
TYNAMO-76 - Re-write the built-in Shiro filters as Tapestry filters
Enjoy!
Tynamo Team
In a nutshell, tapestry-routing allows you to provide your own custom mapping between Tapestry pages and URLs.
Did you ever wanted to change the order of the path params in an URL? now you can!
Let's say you have a page: pages.projects.Members which have 2 parameters in its activation context: (Long projectId, Long memberId) and you want the URL for that page to look like /projects/1/members/1 Just add the @At annotation to you page, like this:
That's it!
tapestry-routing Dispatcher will take care of recognizing incoming requests and dispatching the proper render request
tapestry-routing PageRenderLinkTransformer will do the rest of the work, it will transform every Link for a page render request formatting it according to your route rule.
We really need some feedback, so please give it a try:http://tynamo.org/tapestry-routing+guide
Enjoy!
Improvement
TYNAMO-74 - Support inline Facebook oauth permission screen
New Feature
TYNAMO-72 - Initial implementation of Facebook Oauth
TYNAMO-73 - Initial implementation of federatedaccounts sample
running on GAE
TYNAMO-80 - Implement different windowmodes for Facebook oauth
Here's what Alejandro (the co-founder of Tynamo) had to say about the module:
I don't know if we should release this module, It's so easy to use that's not fair for people that suffered the Facebook nightmare. I want people to suffer as I DID!!! Damn it Kalle!! Excellent work! ![]()
Also check out the live example of federatedaccounts. Enjoy!
Notice how above I first blamed the browsers for not solving the problem, but then ended up sharing the blame with OAuth. That's because a) the UI redressing problem is not specific to OAuth and b) UI redressing is a super-tricky problem to solve. Simply displaying the URL of an iframe (even if browser assisted) is not nearly enough because that too can be easily redressed (see more at http://www.webmonkey.com/2008/10/a_look_at_the__clickjacking__web_attack_and_why_you_should_worry/). Browser developers do are trying to do something about the problem but they just don't agree on exactly what is the right measure (see e.g http://lists.whatwg.org/pipermail/whatwg-whatwg.org/2008-September/016286.html).
So, while waiting for a standards-based solution to the problem is there anything that can be done to improve the user experience of (FB's) OAuth dialog flow? The inline window mode works great if a) you are already authenticated with Facebook (i.e. you have a valid Facebook cookie) and b) you've previously authorized the subject application. However, in all other cases, the inline mode isn't too useful since it's not that simple to find out if the current user is logged onto Facebook or not. You can find the status with FB.getLoginStatus() but you have to include FB's Javascript SDK to the page. The other issue is the frame busting code. Facebook doesn't allow any of its pages to be displayed in an iframe. Instead they simply display a link to "Visit Facebook" when shown in an IFrame. There's no technical or security-related reason why Facebook couldn't allow showing the Oauth authorization window in an iframe when the user is pre-authenticated via cookies. In fact, Facebook already (almost) had this working with Facebook Connect, only it had one crucial flaw: it was asking for user's Facebook username and password in the same dialog.
To improve usability without asking for user's credentials in the same Oauth authorization dialog, Facebook could potentially allow passing a one-time valid user authentication token with the Oauth request, but in some ways that would only shift the responsibility somewhere else. There's an open standard for that as well, called OpenID, and you can by all means use OpenID together with OAuth as demonstrated by Google . Unfortunately though, the window redressing attack is just as big of a problem for OpenID as it is for OAuth. Since OpenID was originally meant for authentication only (though the attribute extensions make it partly an authorization technique) you cannot shift the responsibility any further. I'm not advocating the use of hybrid OpenID+Oauth model either - it may just increase complexity without improving user experience. However, we may be throwing the baby out with the bath water by never allowing Oauth dialogs to be shown in iframes. Certainly the authorization server has to be able to authenticate the end user one way or another, but handling an Oauth callback in an iframe is perfectly secure if you never ask the user's password in the same dialog. Anyhow, with the current standards there's no way out without major security implications, so browsers and ultimately, newer standards need to provide a better, more secure solution.
