function make_follow_url($uname)
{
    return make_ext_url('messages', 'follow', $uname);
}
function make_profile_url($user_name)
{
    return make_ext_url("users", "profile", $user_name);
}
    function avatar()
    {
        if(!isset($_SESSION['active_user']))
            redirect_to(make_url("users"));

        $usr = instance_model('users');
        $user = $usr->get_user_by_id($_SESSION['active_user']['id']);

        if($user == array())
            throw new no_such_user_exception();

        if(!isset($_POST['Submit']))
        {
        // Display main
            $view = instance_view('settings_avatar');
            $view = $view->parse_to_variable(array(
                'user' => $user));
        }
        else
        {
        // Validate file type
            $type = array_pop(preg_split('/\./', $_FILES['file']['name']));

            $valid_extensions = array('png', 'jpg', 'jpeg', 'JPG', 'JPEG');

            for($found_type = 0; $found_type < count($valid_extensions); $found_type ++)
                if($type == $valid_extensions[$found_type])
                {
                    $found_type = -1;
                    break;
                }

            if($found_type != -1)
            {
                new_flash('Invalid file type', 1);
                redirect_to(make_url('settings', 'avatar'));
            }

            $tmpname = 'media/' . sha1(time()) . '.' . $type;

            if (@move_uploaded_file($_FILES['file']['tmp_name'], $tmpname)) 
            {
            // Load the image
                if($type == 'png')
                    $img = @imagecreatefrompng($tmpname);
                else
                    $img = @imagecreatefromjpeg($tmpname);

                if($img == false)
                {
                    new_flash('Problem with image', 1);
                    redirect_to(make_url('settings', 'avatar'));
                }

            // Resize
                $oldsize = getimagesize($tmpname);

                $img_n = imagecreatetruecolor(100, 100);
                imagecopyresampled($img_n, $img, 0, 0, 0, 0,
                    100, 100, $oldsize[0], $oldsize[1]);

                $avatar = 'media/' . $_SESSION['active_user']['name'] . '.jpg';
                $result = imagejpeg($img_n, $avatar , 90); 

                unlink($tmpname);

                if($result == false)
                {
                    new_flash('Problem with image', 1);
                    redirect_to(make_url('settings', 'avatar'));
                }

                print make_ext_url($avatar);

                $usr->update_avatar($user[0]['ID'], 
                    make_ext_url($avatar));

            // Delete the old avatar as long as it is not the default
                $old_avatar = basename($user[0]['Avatar']);
                if(preg_match('/.+default_avatar\.jpg/', $old_avatar))
                    unlink('media/' . $old_avatar);

                redirect_to(make_url('settings', 'avatar'));
            }
            else
            {
                new_flash("File failed to upload");
                redirect_to(make_url('settings', 'avatar'));
            }
        }

    // Display sidebar
        $sb_view = instance_view("settings_sidebar");
        $sb_view = $sb_view->parse_to_variable(array(
            'uid'   => $_SESSION['active_user']['id'],
            'uname' => $_SESSION['active_user']['name']));

        $this->set_template_paramiters(
            array('main_content' => $view,
                  'sidebar'      => $sb_view));
    }
    function follow()
    {
        try
        {
            $this->outer_template = null;
            $rmt = instance_model("remotes");

            if(!isset($this->params[2]))
                die("no user specified");

        // get the user from the database
            $usr = instance_model("users");
            $user = $usr->get_user_by_name($this->params[2]); 

            if($user == array())
                throw new invalid_username_exception();

            $msg = instance_model("messages");

            $messages = $msg -> get_by_user_id($user[0]['ID']);

        // Output
            @Header('Content-type: text/xml');

            echo $rmt->make_messages_xml(
                $user[0]['User_name'],
                $user[0]['Pub_key'],
                $user[0]['Priv_key'],
                $user[0]['Bio'],
                $user[0]['Avatar'],
                make_profile_url($user[0]['User_name']),
                $messages,
                make_ext_url('messages', 'ping'),
                make_ext_url('relations', 'ping')
            );
        }
        catch(invalid_username_exception $e)
        {
            print "Invalid username";
        }
        catch(exception $e)
        {
            print "Server error";
        }
    }
    function new_user($user, $email, $password)
    {
        validate_username($user);
        validate_email($email);
        validate_password($password);

        $salt = sha1(time());

        $hashed_pass = sha1($salt . $password);

        $avatar = make_ext_url('media/default_avatar.jpg');

    // Generate a new RSA key pair
        $res = openssl_pkey_new();
        openssl_pkey_export($res, $priv_key);
        $pub_key = openssl_pkey_get_details($res);
        $pub_key = $pub_key['key'];

        $query = "INSERT INTO `users`
            (`User_name`, `E-mail`, `Password`, `Salt`, `Priv_key`, `Pub_key`, `Avatar`)
            VALUES ('@v','@v','@v','@v','@v','@v', '@v')";

        $this->query($query, $user, $email, $hashed_pass, $salt,
            base64_encode($priv_key), base64_encode($pub_key), $avatar);
    }