Jump to content
Sign in to follow this  
fortek

Ошибка API в IPS 4.4.6

Recommended Posts

Т.к. я использую форум с авторизацией в программе через API с использование ключа, то тут возникла проблема.

Пример авторизации происходит так:

https://SiteName/applications/nexus/interface/licenses/?info&key=MY_KEY

То у меня выбивает ошибку с ответом 400

{"errorCode":0,"errorMessage":"INTERNAL_ERROR"}

Методом подстановки и сравнения файлов. Выяснилось, что подобная проблема проявляется в файле:

../system/Node/Model.php

В функции на 1145-ой строке.

В 4.4.4 функция выглядит вот так:

	public function children( $permissionCheck='view', $member=NULL, $subnodes=TRUE, $skip=null, $_where=array() )
	{
		$children = array();

		/* Load member */
		if ( $permissionCheck !== NULL )
		{
			$member = ( $member === NULL ) ? \IPS\Member::loggedIn() : $member;
			$cacheKey	= md5( $permissionCheck . $member->member_id . $subnodes . json_encode( $skip ) . json_encode( $_where ) );
		}
		else
		{
			$cacheKey	= md5( $subnodes . json_encode( $skip ) . json_encode( $_where ) );
		}
		if( isset( $this->_childrenResults[ $cacheKey ] ) )
		{
			return $this->_childrenResults[ $cacheKey ];
		}

В 4.4.6 функция выглядит вот так:

	public function children( $permissionCheck='view', $member=NULL, $subnodes=TRUE, $skip=null, $_where=array() )
	{
		$children = array();

		$member = $member ?: \IPS\Member::loggedIn();

		/* Load member */
		if ( $permissionCheck !== NULL AND \in_array( 'IPS\Node\Permissions', class_implements( $this ) ) )
		{
			$cacheKey	= md5( $permissionCheck . $member->member_id . $subnodes . json_encode( $skip ) . json_encode( $_where ) );
		}
		else
		{
			$cacheKey	= md5( $subnodes . json_encode( $skip ) . json_encode( $_where ) );
		}
		if( isset( $this->_childrenResults[ $cacheKey ] ) )
		{
			return $this->_childrenResults[ $cacheKey ];
		}

Как видим у условии, есть 3 изменения:

1. Вместо

if ( $permissionCheck !== NULL )

Стоит

if ( $permissionCheck !== NULL AND \in_array( 'IPS\Node\Permissions', class_implements( $this ) ) )

Здесь все хорошо, движок не выбивает ошибку.

2. Строка с переменной $member выведена перед условием $permissionCheck и имеет вид:

Вместо

$member = ( $member === NULL ) ? \IPS\Member::loggedIn() : $member;

Стоит

$member = $member ?: \IPS\Member::loggedIn();

 

Пока что временным решением стоит следующее решение:

Новая переменная $member из 4.4.6 возвращена в условие $permissionCheck. Полет нормальный, API работает.

Результат исправления в коде:

	public function children( $permissionCheck='view', $member=NULL, $subnodes=TRUE, $skip=null, $_where=array() )
	{
		$children = array();
		
		/* Load member */
		if ( $permissionCheck !== NULL AND \in_array( 'IPS\Node\Permissions', class_implements( $this ) ) )
		{
			$member = $member ?: \IPS\Member::loggedIn();
			$cacheKey	= md5( $permissionCheck . $member->member_id . $subnodes . json_encode( $skip ) . json_encode( $_where ) );
		}
		else
		{
			$cacheKey	= md5( $subnodes . json_encode( $skip ) . json_encode( $_where ) );
		}
		if( isset( $this->_childrenResults[ $cacheKey ] ) )
		{
			return $this->_childrenResults[ $cacheKey ];
		}

У кого есть возможность отправить в багфикс IPS - сделайте. Ошибка очень нелицеприятная

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×