Hola! no es recomendado usar fflush para stdin ya que no esta definido.
Este problema ya fue discutido muchas veces asi que voy a ser lo mas claro posible. Cuando se ingresan caracteres por teclado, estos se almacenan en un "bufer" para que
luego funciones como fgets, scanf, etc
tomen los caracteres de ahi.
Aclaracion 1: el ENTER(\n) tambien es un caracter, osea que tambien se almacena en el bufer
Aclaracion 2: fgets lee hasta encontrar un ENTER o
como maximo n-1 caracteres
Supongamos que se ingresa esta cadena: "xDabcde\n". En este caso vos indicaste a fgets que lea 3-1 caracteres, es decir los caracteres 'x' y 'D' se almacenan en el arreglo texto. Es por esto que si se ingresa cualquier cadena, siempre y cuando empiece con "xD", imprime "contraseña correcta" (Esto seria la respuesta a tu segunda duda)
Ahora supongamos que se ingresa otra cadena: "asdfzxc\n". ¿que sucede ahora? como antes los primeros
dos caracteres('a' y 's') se almacenan en texto y se imprime "contraseña incorrecta". ¿pero por que despues no podes ingresar y vuelve a imprimir "contraseña incorrecta" varias veces? Esto se debe a que en el bufer aun queda el resto de la cadena: "dfzxc\n". Para solucionar esto hay que limpiar el bufer; despues de fgets agrega:
while(getchar()!='\n'); // getchar lee del bufer hasta encontrar un '\n', osea limpia el bufer
Saludos