Wednesday, November 23, 2011

New version of GVMax released

Yesterday I released a new version of GVMax. I have not had time to update the documentation on the website yet, but thought I would write something here until I do.

Although to most users nothing much changes, this version is in fact an almost complete rewrite. I completely restructured GVMax to make it much more robust. I is now split into 6 different programs:

  • web: The website and api endpoints.
  • smtp: The mail server in charge of receiving the SMS and VM emails
  • server: Where all the magic happens
  • relay: In charge of handling GTalk messages and out-bound emails (runs on appengine)
  • keyman: In charge of encryption keys (runs on appengine)
  • queue: Holds the incoming emails and GTalk messages until server picks it up.
I can now upgrade the server for example without bringing down the web interface and without losing any messages while it is down.

Encryption

This new version of GVMax is also much more secure. Each user's settings is stored in the database using a user-specific encryption key which is based on their email and pin. What this means is that even I cannot decrypt the data unless the user tells me his email or pin.

Additionally no keys are stored in the server, key management is handled by 'keyman' which is running on appengine. When I start 'server' for example I must enter my 'master' password as well as a 'OneTimePassword' generated by a Yubico key. So for anyone to be able to get the required keys they would need to know my password as well as have access to my Yubico key. Additionally an email is sent to me whenever someone attempts to authenticate with 'keyman'

New Features

This version does have a number of new features as well as some bug fixes
  • Missed call notifications. You can now get missed call notification. (Note you will have to log into GoogleVoice and ensure that GoogleVoice is sending missed call notification emails, since I have not updated my account creation code to do it automatically as I do with SMS and Voicemail.
  • Group SMS. Sending SMS to groups in the old version was hit and miss. It should be working much better in the new version. Note that I will stagger the sending of these SMSs to ensure I don't get blocked. I have access to 50 odd numbers for testing and can send a group SMS to those numbers with no problems. Another user let me know that he was able to send it to a group containing 260 contacts.
  • Two-factor login support. You can now use GVMax even if your Google Voice account uses two-factor authentication. You will ofcourse need to generate a application-specific password for GVMax.
  • Extended API. I have extended the functionality of GVMax's API, so instead of only being able to send SMS, it now has all the functionality available to GVMax (for example you can change settings etc)
There are a number of other small features that I have added and quite a few bug fixes, but I can't remember them right now.

ps: Since there was so much change under the hood, I am sure I have also introduced a few bugs, but hopefully I can iron these out quickly.

Hope you guys like it.

11 comments:

  1. Is gvmax open source? I found references to it being open source, but every place I look for it no longer has the code, sourceforge, etc

    If it is not, could you direct me to something that would take a forwarded email and convert it into text messages through GV? GAE would be preferred, but if not, no big deal.

    ReplyDelete
  2. The current version of GVMax is not open source, the previous appengine based version of GVMax was opensource, but the code there no longer works on appengine.

    If all you want is to send an SMS to a number when you receive an SMS why can't you simply use GoogleVoice for that?

    Alternatively you can have a look at gvmax-post it is an appengine app that receives the forwarded email, parses it and sends an HTTP Post. You can easily change it to do something else instead of sending the http post.

    Project page at: http://code.google.com/p/gvmax-post/

    ReplyDelete
  3. I'm having troubles logging into my gvmax account. I changed my Google Voice password a while back and ever since then it's all gone haywire. When I try to reset my GvMax Password I get this lovley error message:
    "HTTP ERROR 404

    Problem accessing //api/forgotPassword.json. Reason:

    Not Found
    Powered by Jetty://"

    Any help would be appreciated. I'd prefer you email me at me[{at]}mikelierman[dot][com]

    ReplyDelete
  4. Hi,
    I cannot sign up for a new account. When I attempt to set up a GVMax account, it returns Java errors. Please help!

    Thanks!

    ReplyDelete
  5. I'm having the same problem as Jevinkones above me,

    Thanks, see screen capture below.

    java.lang.ArrayIndexOutOfBoundsException: 1
    at net.javalib.googlevoice.GoogleVoice.enableForwarding(GoogleVoice.java:136)
    at com.gvmax.web.GVMaxServiceImpl.createFilters(GVMaxServiceImpl.java:443)
    at com.gvmax.web.GVMaxServiceImpl.signup(GVMaxServiceImpl.java:170)
    at com.gvmax.web.WebInterface.signup(WebInterface.java:134)
    at sun.reflect.GeneratedMethodAccessor111.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:176)
    at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:436)
    at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:424)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:790)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:719)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:669)
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:585)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:754)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:847)
    at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:558)
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1366)
    at net.javalib.util.web.RedirectFilter.doFilter(RedirectFilter.java:38)
    at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:237)
    at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:167)
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1337)
    at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:486)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:119)
    at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:520)
    at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:233)
    at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:973)
    at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:417)
    at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:192)
    at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:907)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:117)
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:110)
    at org.eclipse.jetty.server.Server.handle(Server.java:350)
    at org.eclipse.jetty.server.HttpConnection.handleRequest(HttpConnection.java:442)
    at org.eclipse.jetty.server.HttpConnection$RequestHandler.content(HttpConnection.java:941)
    at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:801)
    at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:224)
    at org.eclipse.jetty.server.BlockingHttpConnection.handle(BlockingHttpConnection.java:50)
    at org.eclipse.jetty.server.bio.SocketConnector$ConnectorEndPoint.run(SocketConnector.java:245)
    at org.eclipse.jetty.server.ssl.SslSocketConnector$SslConnectorEndPoint.run(SslSocketConnector.java:663)
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:598)
    at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:533)
    at java.lang.Thread.run(Thread.java:662)

    Powered by Jetty://

    ReplyDelete
  6. GVMax apparently doesn't want new users. Getting the same error.

    ReplyDelete
  7. This should be fixed now (although GVMax will not be able to automatically create the GMail filters for your account).

    Please use the forum to report bugs, I check that more often.

    ReplyDelete
  8. Where in the GVMax User Manual does it discuss using Google Apps accounts. I am stuck against PIDGIN not supporting Google Talk with App accounts. Any suggestions?

    ReplyDelete
  9. For now, I am forwarding the GVMax IM to another Google Talk account that is straight gMail. Wish there was someway to configure PIDGIN to work with the Apps account. Thankfully GVMax is flexible enough to support the situation.
    If you use Google Apps, then modify your GVMax Active Notifiers by clicking the CHANGE button under your https://www.gvmax.com/account/ settings. The first area in the upper left is Send GTalk Notifications section. Change the information here for our gMail account instead of your gApps.
    When you set up your IM, use your gMail account when setting it up. Once complete your SMS should follow this path:
    SMS->Google Apps gVoice Account->Google Apps eMail Account->GVMax Account->gMail gTalk Account->IM Application
    Fun, huh?

    ReplyDelete
  10. HOW CAN I CONFIGURE THIS TO NOTIFY MY INTERNATIONAL NUMBER?? IS THIS POSSIBLE?

    ReplyDelete
  11. Is there a way to add unicode support to gvmax? International characters get scrambled when passing through gvmax (incoming or outgoing). Thanks

    ReplyDelete