PDA

View Full Version : Custom Page: Permission based on age?


Dax IX
07-26-2014, 07:02 PM
Please forgive me, I'm very new to PHP and vB programming.

For a custom page I'm creating, I'm trying to create access permissions based on a user's age.

For a function that I've placed in an external functions_*.php file, I've done what I *think* calculates the logged in user's age, but now I'm not so sure, because my access permissions aren't working. I've borrowed code from memberlist.php to calculate the user's age and return either their age or false.

function calculate_age($userinfo)
{

global $vbulletin;

if (!isset($userinfo['birthday']))
{
return false;
} else {

$today_year = vbdate('Y', TIMENOW, false, false);
$today_month = vbdate('n', TIMENOW, false, false);
$today_day = vbdate('j', TIMENOW, false, false);

$bday = explode('-', $userinfo['birthday']);

if (date('Y') > $bday[2] AND $bday[2] > 1901 AND $bday[2] != '0000')
{
if ($today_year > $bday[2] AND $bday[2] != '0000')
{
$userinfo['age'] = $today_year - $bday[2];
if ($bday[0] > $today_month)
{
$userinfo['age']--;
}
else if ($bday[0] == $today_month AND $today_day < $bday[1])
{
$userinfo['age']--;
}
}
else
{
return false;
}

if (!$userinfo['age'] AND ($userinfo['age'] < 18))
{
return false;
} else {
return $userinfo['age'];
}
} else {
return false;
}
}
}

Then, after including the function file, to try to calculate permissions based on the calculate_age() function, I used this:

$age = calculate_age($userinfo);

// access permissions
if ((!is_member_of($vbulletin->userinfo, 5, 6, 7)) OR ((!isset($age)) AND ($age != '$nbsp;')) OR ($age < 18))
{
// give no permission unless in usergroup x, y, or z
print_no_permission();
}But, no matter what I do, I don't have permission to view this page's content.

Would anyone mind giving me some pointers as to where I'm going wrong?

Thanks!

kh99
07-26-2014, 07:17 PM
If I'm following this correctly, I think the condition should be:

// access permissions
if ((!is_member_of($vbulletin->userinfo, 5, 6, 7)) AND ((!isset($age)) OR ($age == '$nbsp;') OR ($age < 18)))
{
// give no permission unless in usergroup x, y, or z
print_no_permission();
}


I'm assuming that if age isn't set or it's set to nbsp that the user won't have permission.

Dax IX
07-26-2014, 08:00 PM
Thank you.

I think that helped, but I'm still not getting the results I'm looking for.

I'm pretty sure I've translated something in my function code wrong, but I just can't see where.

This is now my function:
function calculate_age($userinfo)
{

global $vbulletin;

if (!isset($userinfo['birthday']))
{
return false;
} else {

$today_year = date('Y');
$today_month = date('n');
$today_day = date('j');

$bday = explode('-', $userinfo['birthday']);

if (date('Y') > $bday[2] AND $bday[2] > 1901 AND $bday[2] != '0000')
{
if ($today_year > $bday[2] AND $bday[2] != '0000')
{
$userinfo['age'] = $today_year - $bday[2];
if ($bday[0] > $today_month)
{
$userinfo['age']--;
}
else if ($bday[0] == $today_month AND $today_day < $bday[1])
{
$userinfo['age']--;
}
}
else
{
return false;
}

if (!isset($userinfo['age']) AND ($userinfo['age'] < 18))
{
return false;
} else {
return $userinfo['age'];
}
} else {
return false;
}
}
}Here's what I have now for my permissions statement:
$age = calculate_age($userinfo);

// access permissions
if ((!is_member_of($vbulletin->userinfo, 5, 6, 7)) OR (!$age))
{
// give no permission unless in usergroup x, y, or z
print_no_permission();
}

Scanu
07-26-2014, 09:21 PM
There are easier functions to calculate age from birthday, give a look here: http://stackoverflow.com/questions/3776682/php-calculate-age

kh99
07-26-2014, 09:39 PM
Here's what I have now for my permissions statement:
$age = calculate_age($userinfo);

// access permissions
if ((!is_member_of($vbulletin->userinfo, 5, 6, 7)) OR (!$age))
{
// give no permission unless in usergroup x, y, or z
print_no_permission();
}

It seems like that should be AND. Like if they're not an admin or moderator and they are younger than 18, then no permission.

tbworld
07-26-2014, 10:05 PM
The problem you are having is the user condition $userinfo['showbirthday'], which alters when $age is valid in the vbulletin code. In reality all you need to check is if $userinfo['birthday'] is valid.

Using @Scanu suggestion, this is all you need -- although, that code needs to be fully vetted. I believe $userinfo['birthday'] should be properly validated from vBulletin. I would re-validate it if you run many modifications, that might tamper with it.


// For testing purposes use an expanded format,
// you can always combine terms after you have it working.


// Exempt: smods, mods, admins
if (!is_member_of($vbulletin->userinfo, 5, 6, 7))
{
// Should already be validated if comming from vbulletin.
// or add additional validation to be on the safe side.
if (!empty($userinfo['birthday']) && ($userinfo['birthday'] != '&nbsp;'))
{
$birthdate = $userinfo['birthday'];
$birthdate = explode("-", $birthdate);

//Calculate Age (@Scanu's suggestion)
$age = (date("md", date("U", mktime(0, 0, 0, $birthdate[0], $birthdate[1], $birthdate[2]))) > date("md")
? ((date("Y") - $birthdate[2]) - 1) : (date("Y") - $birthdate[2]));

// $Age Check
if (isset($age) && ($age < 18))
{
print_no_permission();
}
}
}

Dax IX
07-26-2014, 10:26 PM
Thanks everyone for their help!

I have it working MUCH more simply now, thanks to suggestions here.

Yes, ordinarily it would be AND, but in this case, while I'm testing some things, it's OR.

Age will be a big factor in what I'm working on, used on several pages, therefore I wanted to do it as a function, which I now have. :)

function calculate_age($userinfo)
{
global $vbulletin;

if (!isset($vbulletin->userinfo['birthday']))
{
return false;
} else {
$bday = explode('-', $vbulletin->userinfo['birthday']);
$bday = $bday[2] . '-' . $bday[0] . '-' . $bday[1];
$age = floor( (strtotime(date('Y-n-j')) - strtotime($bday)) / 31536000);
return $age;
}
}And I have my permissions code:
$age = calculate_age($userinfo);

// access permissions
if ((!is_member_of($vbulletin->userinfo, 5, 6, 7)) OR ($age < 18))
{
// give no permission unless in usergroup x, y, or z
print_no_permission();
}Thanks again, all!

The only thing I'm confused about now is why I can't seem to use $userinfo['birthday'] instead of $vbulletin->userinfo['birthday'] in my function file.

If it's not to much to ask, what is the explanation of that? :)

--------------- Added 27 Jul 2014 at 15:22 ---------------

Stupid question. I just figured it out. :)

--------------- Added 27 Jul 2014 at 15:57 ---------------

Even better age code, borrowed from class_userprofile.php and modified to fit:

function prepare_age($userinfo)
{
global $vbulletin;

$userinfo = $vbulletin->userinfo;
$userid = $userinfo['userid'];

$age = '';

if ($userinfo['birthday'])
{
$bday = explode('-', $userinfo['birthday']);

$year = vbdate('Y', TIMENOW, false, true, true, false, $userid);
$month = vbdate('n', TIMENOW, false, true, true, false, $userid);
$day = vbdate('j', TIMENOW, false, true, true, false, $userid);
if ($year > $bday[2] AND $bday[2] != '0000')
{
$age = $year - $bday[2];
if ($month < $bday[0] OR ($month == $bday[0] AND $day < $bday[1]))
{
$age--;
}
}
}

return $age;
}