function decode_ping($ping, $varify_signature = true)
    {
        $parsed_xml = @simplexml_load_string($ping);

        if(!$parsed_xml)
            throw new malformed_xml_exception();

        if(!preg_match("/[0-9]+\.[0-9]+/", $parsed_xml->protocol_version))
            throw new invalid_protocol_version_exception();

        if($parsed_xml->protocol_version > PROTOCOL_VERSION)
            throw new messages_from_the_future_exception();

    // Decode
        $parsed_xml->user_pub_key = base64_decode($parsed_xml->user_pub_key);
        $parsed_xml->type = base64_decode($parsed_xml->type);
        $parsed_xml->user = base64_decode($parsed_xml->user);
        $parsed_xml->data = base64_decode($parsed_xml->data);

        validate_pub_key($parsed_xml->user_pub_key);

    // Varify signature
        if($varify_signature == true)
        {
            $this->varify_ping_signature($parsed_xml, $parsed_xml->user_pub_key);
        }


    // Validate data
        if(!preg_match("/[a-zA-Z]+/", $parsed_xml->type))
            throw new exception("Type is invalid");

        validate_username($parsed_xml->user);

        return $parsed_xml;
    }
    function test_validate_pub_key_invalid()
    {
        $this->setExpectedException('invalid_public_key_exception');

        validate_pub_key('invalid_public_key');
    }
    function create_follower($id, $remote_url, $remote_name, 
        $remote_profile, $remote_avatar, $pub_key, $relation_pingback,
        $message_pingback)
    {
        $users = instance_model('users');
        $user = $users->verify_user_id($id);

        validate_pub_key($pub_key);
        $pub_key = base64_encode($pub_key);

        validate_url($remote_url);
        validate_username($remote_name);
        validate_url($remote_profile);
        validate_url($remote_avatar);
        validate_url($relation_pingback);
        validate_url($message_pingback);

        $query = "INSERT INTO `followers`
            (`User_ID`, `Remote_URL`, `Remote_name`, `Remote_profile`,
            `Remote_avatar`, `Remote_pub_key`, `Relation_pingback`,
            `Message_pingback`) VALUES
            ('@v', '@v', '@v', '@v', '@v', '@v', '@v', '@v')";

        $this->query($query, $id, $remote_url, $remote_name,
            $remote_profile, $remote_avatar, $pub_key,
            $relation_pingback, $message_pingback);
    }