1212 * limitations under the License.
1313 **/
1414
15+ use Doctrine \ORM \Query \ResultSetMappingBuilder ;
1516use Illuminate \Support \Facades \Log ;
1617use Models \OAuth2 \ResourceServer ;
1718use OAuth2 \Repositories \IResourceServerRepository ;
@@ -93,18 +94,47 @@ public function getByFriendlyName(string $name):?ResourceServer
9394 */
9495 public function getByAudienceAndIpAndActive (array $ audience , string $ ip ):?ResourceServer
9596 {
96- Log::debug (sprintf ("DoctrineResourceServerRepository::getByAudienceAndIpAndActive audience %s ip %s " , json_encode ($ audience ), $ ip ));
97- return $ this ->getEntityManager ()
98- ->createQueryBuilder ()
99- ->select ("r " )
100- ->from ($ this ->getBaseEntity (), "r " )
101- ->where ("r.ips like :ip " )
102- ->andWhere ("r.host in (:host) " )
103- ->andWhere ("r.active = 1 " )
104- ->setParameter ("ip " , '% ' .trim ($ ip ).'% ' )
105- ->setParameter ("host " , $ audience )
106- ->setMaxResults (1 )
107- ->getQuery ()
108- ->getOneOrNullResult ();
97+ Log::debug
98+ (
99+ sprintf
100+ (
101+ "DoctrineResourceServerRepository::getByAudienceAndIpAndActive audience %s ip %s " ,
102+ json_encode ($ audience ),
103+ $ ip
104+ )
105+ );
106+
107+ $ query = <<<SQL
108+ SELECT r.* FROM oauth2_resource_server r
109+ WHERE FIND_IN_SET(' {$ ip }', r.ips) AND r.active = 1
110+ SQL ;
111+
112+ $ hosts_query = "" ;
113+
114+ foreach ($ audience as $ index => $ audience_item ) {
115+ if ($ index > 0 ) {
116+ $ hosts_query .= " OR " ;
117+ }
118+ $ hosts_query .= sprintf (" FIND_IN_SET('%s',r.host) " , $ audience_item );
119+ }
120+
121+ if (!empty ($ hosts_query ))
122+ $ hosts_query = " AND ( " . $ hosts_query .") " ;
123+
124+ Log::debug (sprintf ("DoctrineResourceServerRepository::getByAudienceAndIpAndActive hosts_query %s " , $ hosts_query ));
125+
126+ $ query = $ query . $ hosts_query . " LIMIT 1; " ;
127+
128+ Log::debug (sprintf ("DoctrineResourceServerRepository::getByAudienceAndIpAndActive query %s " , $ query ));
129+
130+ $ rsm = new ResultSetMappingBuilder ($ this ->getEntityManager ());
131+ $ rsm ->addRootEntityFromClassMetadata ($ this ->getBaseEntity (), 'r ' );
132+
133+ // build rsm here
134+ $ native_query = $ this ->getEntityManager ()->createNativeQuery ($ query , $ rsm );
135+
136+ $ res = $ native_query ->getResult ();
137+
138+ return count ($ res ) > 0 ? $ res [0 ] : null ;
109139 }
110140}
0 commit comments