Hackviking.com He killed Chuck Norris, he ruled dancing so he took up a new hobby…

18Mar/130

Google Maps searchbox with autocomplete

I was sitting trying to do some mods on a Queclink GL200 GPS transmitter for the MPS project. After many hours of no luck at all I gave up for the day. If anyone have some input on that please contact me!

So i started messing around with the Google Maps API demo that I made for them instead. Adding some auto complete to the search form instead. I thought I would share what I managed to do. The challange is to do a mach up of Google Maps API and jQuery to get it to work good.

The trick is to attach the jQuery handler to the object. Why?
You have to create the search box dynamically in order to push it on top of the Google Maps canvas.

Entire demo can be found here: http://jsfiddle.net/kallsbo/XgsC6/

First initialize the map and all it's settings:


var map;
var addressField;
var geocoder;

$(document).ready(function () {
    // Define map options
    var mapOptions = {
        center: new google.maps.LatLng(57.698254, 12.037024),
        zoom: 16,
        mapTypeId: google.maps.MapTypeId.HYBRID,
        panControl: true,
        zoomControl: true,
        mapTypeControl: true,
        scaleControl: true,
        streetViewControl: true,
        overviewMapControl: true
    };

    // Define map
    map = new google.maps.Map(document.getElementById("map_canvas"), mapOptions);

    // Define Gecoder
    geocoder = new google.maps.Geocoder();

    // Init searchbox
    initSearchBox();
});

function initSearchBox() {
    // Add searchbox
    var searchControlDiv = document.createElement('div');
    var searchControl = new SearchControl(searchControlDiv, map);

    searchControlDiv.index = 1;
    map.controls[google.maps.ControlPosition.TOP_CENTER].push(searchControlDiv);
}

As you can see we initialize the search box control and put it in a div at the top of the canvas. This is how we create the control and it's auto complete function:


function SearchControl(controlDiv, map) {
    // Set CSS styles for the DIV containing the control
    // Setting padding to 5 px will offset the control
    // from the edge of the map.
    controlDiv.style.padding = '5px';

    // Set CSS for the control border.
    var controlUI = document.createElement('div');
    controlUI.style.backgroundColor = 'white';
    controlUI.style.borderStyle = 'solid';
    controlUI.style.borderWidth = '2px';
    controlUI.style.cursor = 'pointer';
    controlUI.style.textAlign = 'center';
    controlUI.title = 'Sök ex: gatunamn, stad';
    controlDiv.appendChild(controlUI);

    // Create the search box
    var controlSearchBox = document.createElement('input');
    controlSearchBox.id = 'search_address';
    controlSearchBox.size = '80';
    controlSearchBox.type = 'text';

So when you have gotten this far in the code you have the search input box as a VAR. Now whe can use that VAR to attache the function for the auto complete to it:


    // Initiat autocomplete
    $(function () {
        $(controlSearchBox).autocomplete({
            source: function (request, response) {

                if (geocoder == null) {
                    geocoder = new google.maps.Geocoder();
                }

                geocoder.geocode({
                    'address': request.term
                }, function (results, status) {
                    if (status == google.maps.GeocoderStatus.OK) {
                        var searchLoc = results[0].geometry.location;
                        var lat = results[0].geometry.location.lat();
                        var lng = results[0].geometry.location.lng();
                        var latlng = new google.maps.LatLng(lat, lng);
                        var bounds = results[0].geometry.bounds;

                        geocoder.geocode({
                            'latLng': latlng
                        }, function (results1, status1) {
                            if (status1 == google.maps.GeocoderStatus.OK) {
                                if (results1[1]) {
                                    response($.map(results1, function (loc) {
                                        return {
                                            label: loc.formatted_address,
                                            value: loc.formatted_address,
                                            bounds: loc.geometry.bounds
                                        }
                                    }));
                                }
                            }
                        });
                    }
                });
            },
            select: function (event, ui) {
                var pos = ui.item.position;
                var lct = ui.item.locType;
                var bounds = ui.item.bounds;

                if (bounds) {
                    map.fitBounds(bounds);
                }
            }
        });
    });

Then finish up creating the object and push it the the Google Maps Canvas as a custom control:


    // Set CSS for the control interior.
    var controlText = document.createElement('div');
    controlText.style.fontFamily = 'Arial,sans-serif';
    controlText.style.fontSize = '12px';
    controlText.style.paddingLeft = '4px';
    controlText.style.paddingRight = '4px';
    controlText.appendChild(controlSearchBox);
    controlUI.appendChild(controlText);
}
17Mar/130

Missing People Sweden Techsupport

I'm currently involved in a project for Missing People Sweden (MPS). MPS is organizes volunteers to do big search operation for lost people. I was one of the volunteers last fall and saw first hand what a huge task it was to organize all the people and search area. So I went online the same night and wrote a blog entry on my Swedish blog. I questioned why no one could help this organisation with some technical support and build them a system to take care of all this. That's how Missing People Sweden Techsupport was born. First we got put of by the organisation due to an other company that wanted to build it for them. A few month later they delivered a system that was unusable!

So once again I reached out to my contacts in the business and asked them to join me in my quest for this. Unfortunately many of them was busy on other projects or didn't have the drive anymore after being put of the first time. But i managed to get the best project manager I ever worked with to join in. We got a MVC programmer and a jQuery guy on board. We had a few meetings with the, not so technical guys, at MPS. So they din't know tech so well but they are really good at finding people. So we asked them what they needed, what would help them. A few meetings in I felt that we needed to show them something, show that we do stuff not just talk. So I made a quick demo of how we could help them do search segments on a map. Using Google Maps API and some spare time I made a really easy prof of concept.

The other system delivered to them, that they discarded, was 1000 man hours of development. This demo I made was 2 hours of work one night. It has now been used several times to do maps for them when actually looking for real lost people. My point here is to really listen to the customer and give them what they need not what you think they need or whats cool to do with tech!

MPS DEMODemo: http://mpsdemo.kallsbo.se/googlemaps.htm

 

5Feb/110

Google AdSense vs password protected user unique pages

Problem

User unique pages that are password protected. On these pages you would like to show targeted and relevant Google AdSense ads to be able to maximize profits of you cloud service. But how do you get the AdSense bot to index the pages so relevant ads can be shown?

The Facts

  • The Google AdSense bot supports password protected pages. But the service assumes that all pages in the “members” area are the same for every user. This is rarely the case for most cloud services these days.
  • The Google AdSense bot logs on with a predetermined id and password. The credentials are sent as POST parameters.

The Solution

It needs access to all the information but need to be able to distinguish it from each other. It also needs to have a unique marker used by both the user and the bot. So let’s presume that you have put all the functions of your service in different pages i.e. edit.aspx, add.aspx and view.aspx. If you add a ?id={GUID} where the guid corresponds to the user account and give both the user and the bot account access. The user and the bot should be seeing the same thing.

What I haven’t been able to figure out is if the bot requires links between the pages or if it gets the URLs to visit from users requesting ads. But if it relied on links it would index a lot of sites that is irrelevant for the ads. So I think that the bot uses the URL that they get when a client browser requests ads from the page.

Security Issues

Security is another reason making me hope I’m right in my assumptions. Because if I need a special index page for all users and pages it is a security risk. But if I can present read only data without any name tagging to the bot I should be able to keep security risk to a minimal.

The account should only have read-only access to all the data. Not be able to change anything at all. Also you should log everything this account does. You can check for security issues and you can also track whenever the bot re-indexes you information.

As I said before I don’t know exactly how the bot operates but I will test my theories and write again.

Filed under: Google, Security No Comments
26Oct/100

Hacking Facebook, Twitter and more…

No one have missed the release of Firesheep, I hope. The new easy way to hack your way into other peoples accounts on Facebook, Twitter, WordPress, Flickr, Google and more. The exploit is a plugin for Firefox that captures network traffic and intercepts the session cookies from the sites. This isn't new to any one but it's the way it's implemented that is nice and will get people moving trying to fix there broken sites. If you can't scale up your service safely with SSL you shouldn't scale up at all. When you installed the plugin in Firefox just hit "Start Capturing" and when ever it finds a service cookie it will pop-up with the username and picture.

It's been announced that this is an axploit for unprotected wireless networks but that isn't all true. If you use a simple man in the middle attack you can capture the traffic on a wired network you got access to in your school or at your work place. There are simple ways of doing this.

  1. Download Cain & Able and install it! (http://www.oxid.it/cain.html)
  2. Download Wincap and install it! (http://www.winpcap.org/install/default.htm)
  3. Download Firesheep and install it, if your browser saves it as a .zip file rename it to .xpi. Then just open firefox menu "Tools" -> "Add-ons" and drag-and-drop the file into the window. (http://github.com/codebutler/firesheep/downloads)
  4. Read this how-to and do a man in the middle attack on your current network. (http://skateass.com/wordpress/cain-arp-poisoning-cracking-and-sniffing-passwords-and-packets/)
  5. Start Firefox, goto "View" -> "Sidebar" -> "Firesheep" then hit "Start Capturing". Now all the sessions created to the sites will be at your disposal.

You can even create custom site profiles in Firesheep and capture other services then the ones already in there.

What else do you want to read about? Please hit me with some comments!

24Aug/100

Google Apps vs. Google Account

Last night I was trying to stream line my Google services. I have a Google account attached to a Gmail account and then I have several Google apps accounts, where my different domains are connected to Gmail and other services. I was under the impression that an Google Apps account was the same as a Google Account. Wrong! There is a big difference, I learned! I have my private domain connected to Google Apps to sort out e-mail and document storage. On my G-mail Google Account I also had some documents, analytics, calender and contacts. This is synced via Google Sync to my iPhone. With all jail breaking and other stuff it's nice to be able to just reset the phone and then get all my contacts downloaded again.

That's the background, now to what i actually ended up doing. All of the stuff I built upp was on my G-mail Google Account so I wanted to integrate that with my Google Apps account. I logged in the google.com/accounts and added my Google Apps e-mail as an additional e-mail. Then removed my G-mail account and all seemed to work fine except that I couldn't log on the mobile versions of list, calendar and so on. The G-mail server responded that I had the wrong password. The problem I later discovered was that it was two different accounts! When I logged on through mail.mydomain.com it worked fine, trying to use the m.google.com sync server it told me to take a hike. So Google services couldn't integrate my accounts, then I realized that I deleted all my contacts when I removed G-mail support on my Google Account.

Now to the nice thing about it all! When I added the G-mail service to my Google Account again and ended up using the same e-mail address as before all my data was restored. Even thought it told me all would be deleted. So the conclusion is that you shouldnt use a Google Apps e-mail address to create a Google Account, you will get a whole lot of trouble!

Filed under: Google, iPhone No Comments