Як создал свой властный прокси-сервер на Windows 10
с/А \s+//; $ s t r i n g =
с/\с+$//; возврат $ с т р и н г ; 1 ### Получить имя хоста DC из записи SRV, использовать резервное имя хоста, если возможно, под г е т _ d c _ h o s t n a m e ( my $ r e s = N e t : : D N S : : Re s o l v e r — > n e w ( ) ; my $query = $ r e s ; s e r c h ( $ s r v _ l d a p _ host name , » S R V » ) ; my $dc_hostname; if ( $ q u e r y ) j $dc_hostname = ( ( $ q u e r y — > an s w e r ) [ 0 ] ) — > $ t a ;r g e dc_hostname = $backup_dc_hostname; 1 r e t u r n $dc_hostname; 1 ### F u n c t i o n makes an LDAP query and updates D B . It a l s o r e t u r n s OK/ERR if g i v e n user is a member of g i v e n g r o u p , sub q u e r y _ l d a p _ a n d _ s a v e _ t o _ d b ( my $username = s h i f t ; my $group = s h i f t ; my @groups; my $ g r o u p s _ s t r i n g ; my $ c u r r e n t _ t i m e s t a m p = POSIX :: s t r f t i m e ‘%War%d°/cH> T^ 0 ) ; ### Сделать запрос LDAP # Получить имя хоста my $hostname = g e t _ d c _ h o s t n a me e ( ) ; # Создать e command my $command = $ l d a p s e a r c h _ b i n _ p a t h . «—h $имя хоста» . 1 $ l d a p s e ar c h _ com m and _ r e s t . » ‘ ( & ( O b j e c t C l a s s = u s e r ) (• u s e r P r i n c i p a l N a m e = $ u s e r n a m e )) ‘ » ; my @l d a p s e a r c h _ r e p l y = ‘$command’; # Фильтровать строки с ‘memberOf’, сохранять имена групп в массиве для каждой $ линии ( @ l d a p s e a r c h _ r e p l y ) ( if ( $ l i n e =
/A memberOf:/) ( # p r i n t $ l i n e ; # xxx smaz my ($group_name, $ g r o u p _ p a t h ) = $ l i n e =
/A memberOf: CN-^ = ([A,]+),(.+)/; p u s h ( S g ro u p s , t r i m ($ g r o u p _ name ) ) ) 1 # Объединить имена групп в s i n g l e s t r i n g для хранения в БД $ g r o u p s _ s t r i n g = j o i n @groups; ### Сохранить в БД 5 0 B. M O D U L L D A P _ G R O U P _ Q U E R Y . P M # Получить запись для имени пользователя my gqueries = ‘ » $ s q l i t e _ b i n _ p a t h » » $ s q l i t e _ d b _ p a t h » «SELECT * ERCM ^ $table_name WHERE username =’$username ‘ » ‘; # Max 1 R E C O R D TO R E T U R N, I F R E C O R D D DI F O U n D Обновление, вставьте новый I F (S C A L ПРЕДУПРЕЖДЕНИЕ «L D «UPDATE «-> $table_name SET timestamp = ‘$ c u r r e n t _ t i m e s t a m p’, memberof =’ $ g r o u p s _ s t r i n g’ WHERE username = ‘$username ‘\» «) ; i f ( Serr != 0 ) ( syslog ( ‘ err ‘, «L D A P _ G R OU U P _ QU E R Y: E R R O R — C A N’ T ADVE T A B L E $ T A B L E _ N A M E»); ПРЕДУПРЕЖДЕНИЕ «L D A P _ G R O U P _ Q U r Y: E R R O R Serr = system (» $ s q l i t e _ b i n _ p a t h \» $ s q l i t e _ d b _ p a t h \» V I N S E R T ^ INTO $table_name (username, timestamp, memberof) VALUES («DB или LDAP q u e r y. Возврат OK/ERR. sub is_a_member < мое $username = s h i f t ; моя $group = s h i f t ; my $last_valid_timestamp = POSIX : : s t r f time «%Wem%d°/(H>= $ l a s t _ v a l i d _ t i m e s t a m p ‘ » ‘; ### P r o c e s s r e s u l t s #Max 1 r e c o r d to r e t u r n , o t h e r w i s e r e p o r t an e r r o r if ( s c a l a r g q u e r i e s > 1) ( # e r r o r s y s l o g ( ‘ err ‘ , » l d a p _ g r o u p _ q u e r y : E r r o r — d u p l i c a t e r e c o r d for $username») ; warn » l d a p _ g r o u p _ q u e r y : E r r r r — d u p l i c a t e r e c o r d f r $ u s e r n a m e «; die; 1 e l s i f (s c a l a r g q u r i e s == 1) ( # db match — $ r E ($ r E s _ i d, $ r E s _ U S e r n a m e, $ r _ t _ t _ s sef sef _ i meffore _ i meffore _ i meffore sember _ i meffore s _ i meffore s _ i meffore s _ i m match ‘ , $ q u e r i e s [0]) ; my @memberof_groups = s p l i t ( ,’, $ r e s _ me m be r of ) ; for e a c h my $tmp_group (@memberof_groups) < if ($group eq t r i m ( $ t m p _ g r o u p )) < # Является ли участник, который не является участником, не является членом ( # Запрос. м е , $ группа ) ; ### Now p r o c e s s s q u i d A C L q u e r i e s i n e n d l e s s loop , read from STDLN — w r i t e to STDOUT w h i l e ( ) ( c h o p ; # remove l a s t char my ( $ a c l _ u s e r n a m e , $ a c l _ g r o u p ) = s p l i t ; my ^ r e s p o n s e = i s _ a _ m e m b e r ( $ a c l _ имя пользователя , $ a c l _ группа ) ; p r i n t $ re s p o n s e ; 5 2