Buscar en La Comunidad

Showing results for tags 'Risus'.



More search options

  • Search By Tags

    Añade tags separandolos por comas.
  • Search By Author

Tipo de Contenido


Foros

  • El núcleo de PHPost
    • Novedades e información
    • La taza y el café
    • Presentaciones
  • PHPost Risus
    • Actualizaciones
    • Proyectos derivados
    • Versión 1.1
    • Versión 1.2
    • Reporte de bugs
  • Zona Webmaster
    • Posicionamiento (SEO)
    • Monetización
    • Social Media
    • Programación
  • La esquina
    • Rincón del PC
    • Rincón del móvil

Calendars

No hay resultados


Encontramos 28 resultados

  1. blogi

    A continuación les dejo la actualización o nueva versión de PHPost Risus Blog, la cual solucioné varios errores que tenía y le cambie el diseño, ademas agregue nuevas funciones para hacerla más similar a una CMS. ¿Qué trae de nuevo? Junto a la posibilidad de agregar una thumbnail o portada al escribir una entrada, ahora también se puede agregar una descripción, la cual incluiré en el tema Instagram Blog que subiré en breve. El diseño es responsive, utiliza Bootstrap 3 y Fontawesome como proveedor de iconos. Demo: LiDesign Descarga: Mega Cualquier problema me avisan
  2. Hola! Hace unos dias deje avances de la modificación a Risus que hice y hoy se las vengo a dejar para que la prueben y me digan que tal va. Bueno, PHPost Risusu Blog es la versión de Risus pero en CMS, es decir, un sistema para gestionar contenido, estilo Wordpress o Blogger, con el cual podrán tener sus propios blogs usando uno de los script más seguros que hay. Cuenta con un diseño minimalista, usando Bootstrap y gracias a la plantilla AdminLTE del usuario Dark que publicó este diseño adaptado a PHPost pude hacer este proyecto de forma más rapida ya que me ahorro bastante trabajo Trae dos plantillas, la default que tiene solo una columna en la home, y la Cuatro que es la que dejaré en la captura más abajo con dos columnas. Cuenta con el instalador que trae por defecto PHPost, para poder instalar los complementos que le agrege (Portadas en post y perfiles), asique para instalarlo lo hacen como instalar Risus, desde: http:// TUWEB.COM /install/index.php Captura del script Descarga: Mediafire Cualquier problema lo dejan en los comentarios o por mensaje privado. Saludos!
  3. Hola amigos, hace tiempo que ya no he publicado nada y es por temas de trabajos y proyectos en los que estoy, pero hoy les vengo a dejar un avance de mi modificación al script original de PHPost Risus, se trata de PHPost Risus Blog (No soy ingenioso con los nombres ), es básicamente una CMS con la cual podrán montar sus propios Blogs personales, hecha a base de Risus y con un diseño responsive utilizando Bootstrap. Esto lo hice sobre la plantilla AdminLTE que está en el foro, la rediseñe a mi gusto y le dejo los créditos al que adapto ese diseño a PHPost. Este proyecto lo tengo al 80%, aun me faltan terminar algunas partes pero ya está casi terminada. Estoy trabajando a la par con el proyecto PRMD de MrDioamDev para tener ambos proyectos listos lo más pronto posible, pero como llevo trabajando con esta modificación más tiempo, es seguro que saldrá antes(Blog). A continuación les dejo unas capturas de lo que vendría siendo PHPost Risus Blog. Aun me falta terminar la administración y algunos detalles del sitio en general. Pueden dejar sus sugerencias de algo que falte Saludos!
  4. Hola gentucilla de Phpost, que tal?, supongo que cascandola. Hoy les presento mi MierdaWeb, una pagina creada para postear toda clase de mierda, Porno duro y cosas asquerosas como The Walking Dead, si, asi es, toda la mierda acaba parando en mi mierdaWeb. Si quieren perder 5 segundos de vuestro preciado tiempo, pueden visitarla. No me enrrollo mas. WWW.ELITEWAREZ.COM.ES Chiste malo: Dos hombresvan paseando por la calle y se encuentran con una fabrica de aceros inoxidables y le dice uno al otro..., nos hacemos?.
  5. Buenas... Hace un rato el usuario Vellenger me indicó que la imagen que habitualmente aparecía como "Captcha" no se muestra en el registro de ninguna web. Comprobé si ocurría lo mismo en la demo oficial y efectivamente no funcionaba. Sin embargo, la edición que estaba programando hace unos meses sí que tiene funcionando el Captcha, ya que fue actualizado. La razón por la que no se muestra es que Google ha desactivado los anteriores enlaces donde se alojaban los archivos que Risus utiliza. La solución aplicada en la edición mencionada fue la siguiente: 1. Sobrescribir este archivo en /inc/ext/: recaptchalib.php 2. Abrir el archivo themes/{tu_plantilla}/templates/t.php_files/p.registro.form.tpl, buscar: http://api.recaptcha.net/js/recaptcha_ajax.js Y reemplazar por: http://www.google.com/recaptcha/api/js/recaptcha_ajax.js En teoría, eso sería suficiente para que la imagen volviera a aparecer y el registro vuelva a funcionar. La descarga del script también ha sido actualizada. Hasta otra
  6. hola sres de phpost estoy instalando la version de descarga disponible en el inicio de la pagina pero al momento de finalizar la instalacion me muestra la pagina sin estilos todo desordenada a que se debe ?
  7. estoy instalando la web en localhost todos los pasos bien pero al momento de ingresar al sitio despues de finalizarf la instalacion me aparece la pagina como sin estilos todo desordenada por que ?
  8. Como mejorar risus y que venga esto por default. 1) Que tenga el editor ckeditor (ya que se le puede instalar 462 plugins. http://ckeditor.com/addons/plugins/all). 2) En el editor las imágenes subidas guardarlas en forma automatica, ej. Gdrive, dropbox, etc. 3) Que tenga búsqueda en los comentarios. 4) Que sea Responsive (pc, notebook, tablet, celular). 5) En amigos, formar carpeta personal con grupos). 6) Mandar mail a un grupo de personas de la agenda. 7) Limitar acceso a los blog por grupo de personas. 8) Sistema de chat propio. 9) Multidiomas (selector de idioma, independiente a traductor de Google). 10) Agreguen Ustedes…. Algunos de estos mod ya están en el foro, pero no viene por default.
  9. Hola amigos, hace dias que no publico nada en el foro y hoy vengo a dejarles un pequeño avance del diseño que estoy desarrollando, lo llame Infinitum ya que no sabía como ponerle y fue la primera palabra que se me vino a la mente Pueden dejarme sugerencias, se los agradecería mucho. Saludos!
  10. Hola que tal alguien sabría como poder Compartir fotos, videos, link desde risus movil. Algo como tiene taringa.
  11. risus

    Hola gente le dejo este Risus ya modificado por el usuario Hades solo que ahora le e agregado unos cuantos mod mas. Les dejo link al post original del risus modidifcado por HADES por sus créditos: Bueno ahora les muestro lo que le e agregado yo Este mod Demo: Este mod: Demo: Este Mod DEMO: Este Mod: DEMO: Bueno creo que esos son todos seguro tiene algunos mas como el de vincular con Facebook y el generador de etiquetas entre otras modificaciones que le hice pero no re cuerdo cuales mas Aparte de todos los módulos que ya le instalo el usuario HADES. Recuerden se instala normal el Risus y después de terminar la instalación se van a su phpmyadmin y generan las consultas que les dejo en un block de notas para que todos los módulos corren perfectamente. Enlace de descarga:
  12. Aqui les comparto este complemento para los que necesiten hacer uso de codigos en sus web ( Php, JavaScript y Css ) Este complemento es administrable para determinar el estilo del Theme que se quiera usar. Le he agregado la opcion de uso para tres tipos de codigos como indique arriba, pero se puede agregar otos tipos si se lo desea. Hacemos esta consulta SQL: ALTER TABLE `w_configuracion` ADD `codes` int(2) NOT NULL DEFAULT '1'; En bbcode.inc.php buscamos: array('tag' => 'success', 'replace' => '<div class="bbcmsg success">{param}</div>') Y agregamos arriba: array('tag' => 'php', 'replace' => '<pre class="brush: php;">{param}</pre>'), array('tag' => 'js', 'replace' => '<pre class="brush: js;">{param}</pre>'), array('tag' => 'css', 'replace' => '<pre class="brush: css;">{param}</pre>'), En c.core.php buscamos: case 'normal': // BBCodes permitidos $parser->setRestriction(array('url', 'code', 'quote', 'font', 'size', 'color', 'img', 'b', 'i', 'u', 's', 'align', 'spoiler', 'swf', 'video', 'goear', 'hr', 'sub', 'sup', 'table', 'td', 'tr', 'ul', 'li', 'ol', 'notice', 'info', 'warning', 'error', 'success')); Y en esa linea despues de: , 'success' Agregamos: , 'php', 'js', 'css' En c.admin.php buscamos: 'chat' => $tsCore->setSecure($_POST['chat']), Y agregamos arriba: 'codes' => $tsCore->setSecure($_POST['codes']), Mas abajo buscamos: , `offline_message` = \'' . $c['offline_message'] . '\' Y agregamos al lado: , `codes` = \'' . $c['codes'] . '\' En acciones.js buscamos: lang['Upload'] = "Subir Imágenes"; Y agregamos abajo: lang['Codigo'] = "Codigo"; Mas abajo buscamos: {name:lang['Upload'], beforeInsert:function(h){ markit_upload(h); }}, Y agregamos abajo: {name:lang['Codigo'], dropMenu :[ {name:'PHP', openWith:'[php]', closeWith:'[/php]' }, {name:'JS', openWith:'[js]', closeWith:'[/js]' }, {name:'CSS', openWith:'[css]', closeWith:'[/css]' } ]}, En estilo.css buscamos: .markItUp .markItUpButton17 a { background:transparent url('images/bbcodes.png') no-repeat scroll left top; background-position: left -256px; height: 10px; } Y agregamos abajo: .markItUp .markItUpButton18 a { background:transparent url('images/codec.png') no-repeat 0px 2px; height: 10px; width:30px; } .markItUp .markItUpButton18 a:hover { background:transparent url('images/codec2.png') no-repeat 0px 2px; color:#000; } .markItUpButton .markItUpButton18-1 a:hover{ background:#0CF url('images/codec2.png') no-repeat 0px 2px; } .markItUpButton .markItUpButton18-2 a:hover{ background:#0CF url('images/codec2.png') no-repeat 0px 2px; } .markItUpButton .markItUpButton18-3 a:hover{ background:#0CF url('images/codec2.png') no-repeat 0px 2px; } En m.admin_configs.tpl buscamos: <dl> <dt><label for="ai_chat">Chatango ID:</label><br /><span>Por defecto puedes agregar un chat de <a href="http://chatango.com">Chatango</a> para tu web, solo crea tu grupo he ingresa el nombre. (Dejar vacío para usar xat)</span></dt> <dd><input type="text" id="ai_chat" name="chat" maxlength="20" value="{$tsConfig.chat_id}" /> </dd> </dl> Y agregamos arriba: <dl> <dt><label for="codes">Estilos para Códigos</label><br /></dt> <dd> <select id="codes" name="codes" style="width: 266px;" class="select"> <option value="0" {if $tsConfig.codes == 0}selected{/if} >Theme Dark</option> <option value="1" {if $tsConfig.codes == 1}selected{/if} >Default</option> <option value="2" {if $tsConfig.codes == 2}selected{/if} >Django</option> <option value="3" {if $tsConfig.codes == 3}selected{/if} >Eclipse</option> <option value="4" {if $tsConfig.codes == 4}selected{/if} >Emacs</option> <option value="5" {if $tsConfig.codes == 5}selected{/if} >Fade To Grey</option> <option value="6" {if $tsConfig.codes == 6}selected{/if} >Light</option> <option value="7" {if $tsConfig.codes == 7}selected{/if} >MD Ultra</option> <option value="8" {if $tsConfig.codes == 8}selected{/if} >Midnight</option> <option value="9" {if $tsConfig.codes == 9}selected{/if} >Night</option> <option value="10" {if $tsConfig.codes == 10}selected{/if} >RDark</option> </select> </dd> </dl> En main_header.tpl buscamos: </head> Y agregamos arriba: {if $tsPage == 'posts' && $tsPost.post_id} <link href='{$tsConfig.css}/codes/shCore.css' rel='stylesheet' type='text/css'/> <link href='{$tsConfig.css}/codes/shTheme{if $tsConfig.codes==0}Dark{elseif $tsConfig.codes==1}Default{elseif $tsConfig.codes==2}Django{elseif $tsConfig.codes==3}Eclipse{elseif $tsConfig.codes==4}Emacs{elseif $tsConfig.codes==5}FadeToGrey{elseif $tsConfig.codes==6}Light{elseif $tsConfig.codes==7}MDUltra{elseif $tsConfig.codes==8}Midnight{elseif $tsConfig.codes==9}Night{elseif $tsConfig.codes==10}RDark{else}Default{/if}.css' rel='stylesheet' type='text/css'/> <script src='{$tsConfig.js}/codes/shCore.js' type='text/javascript'></script> <script src='{$tsConfig.js}/codes/shBrushCss.js' type='text/javascript'></script> <script src='{$tsConfig.js}/codes/shBrushPhp.js' type='text/javascript'></script> <script src='{$tsConfig.js}/codes/shBrushJScript.js' type='text/javascript'></script> <script language="javascript" type="text/javascript"> {literal} SyntaxHighlighter.config.stripBrs = true; SyntaxHighlighter.all(); {/literal} </script> {/if} Subimos los archivos a sus respectivas carpetas: Descargar Complemento Syntaxhighlighter Pueden elegir el que les agrade mas. Espero les guste y sea de utilidad para los que usamos codigos en nuestras web.
  13. Hola quisiera arreglar este error que me salio en la home y en posts Error 400 Bad Request 500 Internal Server Error bien tvasusta - Compartimos y nos divertimos tvasusta - Compartimos y nos divertimos Espero ayuda gracias
  14. Hola a todos mi duda esta al finalizar me sale esto Fatal error: Call to undefined function cleanRequest() in /opt/lampp/htdocs/header.php on line 104 Reviso por si me falta el archivo y esta bien correctamente alguien sabe porque no me va?? Gracias
  15. Hola que tal :3 esto no viene siendo ningún diseño ni nada por el estilo solo una optimizacion de todas las imágenes que están en themes/default/images y a que me refiero con optimizacion se preguntan pues simplemente e reducido el tamaño de todas las imágenes del tema por defecto asiendo que phpost cargue como un rayo ojo la calidad de las imágenes no se ven afectadas en ningún sentido descargenlas y prueben para que vean link: https://mega.nz/#!Ytw1CaCI!7S6HuUqiSwCVHLivU8zZpNI5YneYE7i0JQR90yANSGg Tamaño comprimido 750KB (768,782 bytes) Tamaño descomprimido 0.98MB (1,030,168 bytes)
  16. La idea es la misma que tuvo aperpen es que entre todos construyamos un post muy grande que pueda ayudar a mucha gente. (Esta bien publicado? si no cambien de lugar) Así que para colaborar puedes dejar un comentario con el link del MOD que te parece que se merece estar ahí. - Se aceptan en comentarios mas mods para agregar. - Lo voy a estar actualizando cada fin de mes. - No se tratar de un top, acá no se compite. - No esta ordenado por quien tiene +1. 1) RChat estilo Cbox [22] by Rhuan Buen chat estilo Cbox como tiene este mismo foro. 2) [MOD] Risus Mobile V2.5 [13] by Kmario19 Muy bueno para los que quieran entrar a tu web con celular. 3) [MOD] Slider en post [17] by Basdower Sirve para poner slider a las imágenes de tu post. 4) [MOD] Emoticones Administrables V2 [15] by Kmario19 Mod para borrar,editar y agregar mas emoticones a tu web. 5) [MOD] no CAPTCHA reCAPTCHA para el registro [14] by Kmario19 Si estas cansado del viejo captcha, aca esta tu mod! 6) Fondo de perfil y Cabecera adaptados a la 1.2 | Tutan [12] by MarcusFenix Sirve para poner fondo de perfil y cabecera como la portada de facebook. 7) [MOD] Sitemap y rss v1.2 [10] by Rengo Excelente mod para mejorar el posicionamiento SEO. 8) Nube de tags recientes [9] by Kmario19 Este mod muestra los tags aleatorios y automáticos. 9) [MOD] Inicio de Mediafire [9] by Altffenser Este mod cambia el login por uno estilo de Mediafire. 10) Mods más importantes actualizados y fixeados a 1.2 [11] by Kmario19 Variados mods como Archivos, Juegos, Calendarios, etc para v1.2 . 11) [MOD] Notificación de cumpleaños del usuario que sigues [15] by Kmario19 Al igual que el facebook te notifica cuando un user que sigues cumple años. 12) Actualización Control de Mensajes Privados V2 - Vellenger [1] by Aleperix Para controlar los mensajes privados de todos los usuarios de tu web. 13) [MOD] Insertar Video Reproductor Iframe Embed [No Youtube] con boton incluido en el editor wysibb [4] by ReModWrite Permite introducir vídeos iframe embed de reproductores tales como nowvideo, allmyvideo entre muchos otros. 14) Aviso al Primer administrador al solicitar cambio de nick [9] by rooteroman Recibirás una notificación en su panel de avisos cuando haya alguna solicitud de cambio de nick pendiente. 15) [Mini-Mod] SCM Music Player [6] by Rengo Reproductor de música que funciona sin detener la música mientras navegas por la web. 16) Whatsapp Emoji Para Emoticones Administrables [Full] [6] by Rengo Emoticones Administrables estilo Whatsapp. 17) (MOD) Ordenar posts como foro en la home THEME Life [1] by ReModWrite Ordenar posts como foro en la home THEME Life, Funciona también en el theme default. 18) [Mod] Moderación de fotos - Aprobar antes de publicar [12] by Kmario19 Moderar una foto antes de ser pública. 19) RChat estilo grupos de WhatsApp [27] by Rhuan Plantilla estilo Whatsapp para el anterior RChat que publico. 20) [Fix] Notificacion: "La publicación que has solicitado no existe" [23] by Kmario19 Fix de cuando alguien pone me gusta en tu comentario y en el monitor te dice que no existe. 21) [Mod] Aviso de registro de clon a moderadores y administradores [23] by Alan Aviso de cuando alguien se registra con una misma IP o sesión. 22) ...
  17. integrar

    Hola que tal comunidad solo quería saber si alguien con mucha cancha sabría como integrar HybridAuth, Open Source Social Sign On PHP Library a risus creo que a muchos les servirá.
  18. Hola amigos, comprobando las novedades de la actualización me topé con algunos errores, y aquí las posibles soluciones... 1) Evitar que otro admin borre tu cuenta Sucede que otro administrador puede borrar tu cuenta completa desde la administración, y no se le debería permitir borrar la cuenta del primer usuario del sitio, o sea el creador del sitio. Para evitar eso, vamos al c.admin.php y en la línea 1004 aprox. buscan: function deleteContent($user_id){ global $tsUser; y debajo de eso agregamos: if( $user_id == 1) return "No puedes eliminar " . ($_POST['bocuenta'] ? "la cuenta" : "contenido") . " del primer administrador"; Con eso, nadie podrá borrar contenido o la cuenta completa del administrador. 2) Remplazar el Restriction por setRestriction Al parecer, a Isidrin se le paso un código Pues, se puede comprobar en el bbcode.inc.php en la línea 38 aprox, el $restriction está en privado. private $restriction; Y no se puede llamar desde otro archivo, entonces el archivo c.core.php en la línea 444 aprox. lo llama, y se produce un error. $parser->restriction = array('url', 'code', 'quote', 'quotePHPost', 'font', 'size', 'color', 'img', 'b', 'i', 'u', 'align', 'spoiler', 'swf', 'goear', 'hr', 'li'); Para resolverlo, buscan lo anterior en la línea indicada y lo remplazan por: $parser->setRestriction(array('url', 'code', 'quote', 'quotePHPost', 'font', 'size', 'color', 'img', 'b', 'i', 'u', 'align', 'spoiler', 'swf', 'goear', 'hr', 'li')); Y se resolverá 3) Establecer el máximo del size Un usuario al momento de utilizar este bbcode le puede cambiar el número de pixeles que va a tener como tamaño el texto, y si le agrega un número exagerado se muestra enorme el texto y nada bueno. Para resolverlo, remplacen en el archivo SizeValidator.php ubicado en Raiz > inc > ext > JBBCode > validators lo siguiente: return is_numeric($input) && $input > 0; por: if( $input > 0 && $input < 25 ) return is_numeric($input); return false; Donde el número de pixeles no debe ser mayor o igual a 25... Por ahora, eso es todo _______________________ Tambien quiero reportar un bug, sucede que se puede agregar bbcodes en los muros, cosa que no sucedia en versiones anteriores. Y para Isidro, por favor para que active el boton Source del CKEditor, pues con eso me ayudo un poco para hacer los topic
  19. Hola amigos, bueno asi como dice el titulo, tengo esa duda, que a lo mejor es algo tonto pero yo no se y me gustaria saber para decirdir que version de phpost usar. ¿Puedo instalar un tema o un complemento creado para risus rc1 a la ultima version de phpost risus que es la rc2? Por favor respondan, gracias de antemano...
  20. Hola amigos, queria saber si alguien no puede hacer un mod, de la vista previa del post asi como tiene el foro aca... me refiero a esto! subir fotos Porfisss a ver quien es el bueno!!!!! saludos y gracias!!
  21. ¡Buen día! Sois muchos los que os estaréis preguntando qué es la notificación que habéis recibido en vuestra web referente a una actualización llamada "Priority Update". Pues bien, os lo voy a explicar. Priority Update es una actualización enviada oficialmente desde PHPost a todas las webs con Risus instalada. Es decir, desde PHPost ha solicitado a todas aquellas webs que cumplan ciertos requisitos (copyright y actividad) a modificar parte del código del script para añadir el parche correspondiente. El parche en cuestión añade una mejora de seguridad contra los ataques CSRF que se estaban llevando a cabo en diferentes sitios webs, engañando a los usuarios y administradores sin que éstos lo supieran para hacerse con el control del sitio o sacar provecho de él. Para evitar el problema de raíz, habría que rehacer la programación del script; incluyendo complementos y plantillas, lo cual no es práctico a estas alturas. Sin embargo, con este parche, creemos que es suficiente para evitar el problema. Como su nombre indica, consideramos que esta actualización es prioritaria y todas las webs deberían tenerla aplicada, pero no todo el mundo entra a su administración diariamente ni tampoco al foro, por lo que podrían demorar en saber que la actualización existe y por tanto caer en "la trampa" del atacante. Además de eso, como ya he mencionado, este problema no sólo afecta a los administradores, sino que a los usuarios normales también les afecta, pudiendo el atacante -entre otras cosas- hacerse con el control de la cuenta del usuario engañado, y eso no es nada bueno. - Si has recibido "Priority Update 1 y 2" entre ayer y hoy, significa que tu sitio ha sido actualizado dos veces. Una vez para añadir el parche, y otra para mejorarlo. - Si sólo has recibido "Priority Update 1 o 3" y lo has recibido hoy, significa que has recibido directamente el parche mejorado; ya que algunos sitios webs experimentaban problemas de acceso, registro y demás. La oleada de actualizaciones terminará aproximadamente en 40 horas desde la publicación de este topic, por lo que si el 6 de noviembre tu sitio web no ha recibido ninguna notificación y el panel de administración sigue indicando que la versión instalada es otra diferente a "1.2.3.000", contacta conmigo. Podéis ir viendo el progreso de sitios actualizados en la página principal. Un saludo
  22. Hace poco descargué la ultima version Risus 1.2.400 y fui resubiendo todo de nuevo hasta tratar de actualizar los mods para tener lo mas actualizado que me fuese posible, hoy, me ha aparecido este aviso de alerta: " Hola. Le informamos que este sitio web ha recibido correctamente Priority Update 2; la segunda parte de un parche que mejora la seguridad contra ataques CSRF " luego he visto que en la Administración aparece la version Risus cambiada a: Version:1.2.3000 [ notese que es 3000 y no 300 ]. Quiere decir que la actualizacion v.1.2.400, la quitaron por algo? Ademas de eso desaparecieron "los botones superiores de monitor, mensajes,favoritos, borradores, cuenta, perfil" cosa que estaba bien, pues no he realizado cambios de hace dias y estaba bien todo. <<<<--(Ya esta parte la solucioné resubiendo archivos y se ven los botones), pero: ¿que cambio trae este cambio? ¿que es la Priority Update 1 y la 2 ? gracias! silohay.lgn1.com aqui las imagenes: http://i.imgur.com/YgpY8iA.png
  23. Buenas noches. Ayúdenme por favor, cada vez que realizo un cambio en mi comunidad y actualizo, me sale "Esta página web no está disponible" !
  24. mod

    Por casualidad me topé con Latch, una app que permite activar o desactivar la ejecución de un proceso. En un principio elevenpaths la creó para que un usuario active o desactive la identificación o login en una web, permitiendo bloquear el acceso aunque se introduzcan correctamente el nombre de usuario y contraseña, permitiendonos desactivar la cuenta si el usuario no la está usando, pero hace poco pasó al siguiente nivel, implantandose con éxito con infinidad de usos, desde iniciar sesión en windows hasta permitir modificar un archivo del sistema, ¿flipante no?. El usuario gestiona este acceso con la app Latch que actualmente está disponible gratuitamente para android, ios y windows phone en sus respectivas stores. El proceso para el usuario no puede ser más sencillo, la idea es simular la utilización de candados con posicion de bloqueado o desbloquedo, lo que permite con solo un toque bloquear el acceso a toda nuestra vida digital, el acceso a una web, a una sección, a nuestra sesión de windows, ect las posibilidades son infinitas. Cabe destacar que si se produce una solicitud del estado de un candado y este se encuentra bloqueado, llegará una notifiación al dispositivo alertando de un posible robo de contraseña. La acción de sincronización que permite a un usuario dar de alta un candado se denomina pareado por ejemplo para habilitar el candado de acceso a la web de telefónica con nuestro latch debemos parear nuestro usuario con nuestra app. Esta acción se realiza en el sitio una vez estamos logueados introduciendo un código en la web que genera la app. Una vez estamos pareados no tendremos que introducir nunca más ningún código, esta es la gran diferencia con otras alternativas como goolge authenticator. A los desarrolladores Latch también les permite crear operaciones que no son más que subcandados, asi con un solo pareado los usuarios podrán gestionar diferentes candados para diferentes acciones, por ejemplo, se podría tener un subcandado para el login, otro para enviar mensajes privados, otro para crear un artículo, otro para editar la cuenta de usuario, ect. El proceso no es más que una comprobación del estado de un candado (on,off) con un if. El mod lo detallaré de la mejor forma posible para que podais añadir un candado en el lugar que vosotros querais. El ejemplo que vereis de crear post es funcional pero si latch bloquea la publicación no se guardarán los datos del post por lo que si el usuario se despiesta y no desbloquea el candado pierde el post y lo tendrá que volver a crear, habría que tocar el javascript para que guarde los datos. Pensar que es solo un ejemplo, pude haber cogido otro como envio de mensajes privados pero cogi ese. Haber si asi se acaban los kakeos de los que meten la clave admin de su web en el registro de otras. También podeis ponerlo en el ftp, pero la verdad es que aun no miré como sería. La instalación parece larga, pero no es tanto, lo que pasa que voy detallando algunas cosas, también es por culpa del formulario de pareado, una vez instalado el mod para agregar un nuevo candado solo sería agregar unas 6 lineas. Ahora que están explicados los términos básicos paso a la instalación del mod: Tenemos que crearnos una cuenta de desarrollador en Latch. Una vez logueados vamos a Mis aplicaciones y damos en crear nueva aplicación. Le ponemos un nombre, el nombre que le pongamos será el nombre visible por lo usuarios que lo utilicen pero se puede cambiar en cualquier momento. Una vez creada pasaremos a la página de edición de la aplicación, podremos cambiar la imagen por el logo de nuestra web entre otras opciones. También tendremos visibles los códigos "ID de aplicación" y "Secreto" que nos harán falta para configurar la api de Latch en nuestra página web. Los códigos son ligeramente diferentes si tenemos operaciones (subcandados) o no, pero lo explicaré luego porque solo es cambiar dos lineas. Para la instalación utilizaré operaciones de login y crear post, asi que en la misma ventana en la parte de abajo en "operaciones" damos en "añadir", ponemos un nombre y damos otra vez en "añadir". Se creará la operación con su id de operación que también nos hace falta. El resto de opciones como 2º factor OTP aun no lo probé. El email y teléfono no es necesario ponerlo para utilizar la aplicación. Ok, tenemos nuestra aplicación de latch creada, pero antes de salir de la web vamos a descargar los archivos necesarios. En el menú de la izquierda vamos a "plugins y SDKs" , en la parte inferior de la página en SDKs buscamos y descargamos los SDKs de php. Descomprimimos y renombramos la carpeta que contiene los archivos a "latch" (sin comillas) subimos los archivos a la raiz de la web de forma que queden latch/archivos.php Ahora creamos una tabla para guardar las ids de los usuario en la base de datos: ALTER TABLE `u_miembros` ADD `user_latch` TEXT NOT NULL Luego nos vamos a header.php y buscamos: /* * ------------------------------------------------------------------- * Agregamos los archivos globales * ------------------------------------------------------------------- */ // Contiene las variables de configuración principal include 'config.inc.php'; Debajo agregamos (se puede incluir directamente en las funciones en vez de header, pero si son varios candados no vale la pena): //Archivos api Latch include_once("latch/Latch.php"); include_once("latch/LatchResponse.php"); include_once("latch/Error.php"); Luego buscamos: // Mensajes $tsMP = new tsMensajes(); y debajo agregamos: //Credenciales API Latch $latchid = array( 'appId' => 'TU APP ID', 'secret' => 'TU CÓDIGO SECRETO', ); Si tenemos operaciones creadas también las añadimos, por ejemplo en este caso quedaría así: //Credenciales API Latch $latchid = array( 'appId' => 'TU APP ID', 'secret' => 'TU CÓDIGO SECRETO', 'opLogin' => 'ID OPERACIÓN', 'opCrearpost' => 'ID OPERACIÓN', ); El nombre de la id (columna izquierda) podeis poner el que querais por ejemplo en vez de opLogin podeis poner solo login pero debeis fijaros para poner el mismo nombre cuando necesitemes los ids. Ahora nos vamos a la funcion en la que queremos incluir la comprobación de estado. En el caso del login es diferente porque al no estar logueado tenemos que hacer la consulta con el nombre de usuario del formulario de login, una vez el usuario está logueado no la necesitaremos porque usaremos variables nativas de Risus (phpost). Nos vamos a c.user.php y buscamos: function loginUser($username, $password, $remember = FALSE, $redirectTo = NULL){ global $tsCore; Reemplazamos por: function loginUser($username, $password, $remember = FALSE, $redirectTo = NULL){ global $tsCore, $latchid; En la misma función buscamos: // CHECAMOS if($data['user_password'] != $pp_password){ return '0: Tu contraseña es incorrecta.'; } else { if($data['user_activo'] == 1){ // Actualizamos la session $this->session->update($data['user_id'], $remember, TRUE); // Cargamos la información del usuario $this->loadUser(true); // COMPROBAMOS SI TENEMOS QUE ASIGNAR MEDALLAS $this->DarMedalla(); /* REDERIGIR */ if($redirectTo != NULL) $tsCore->redirectTo($redirectTo); // REDIRIGIR else return TRUE; } else return '0: Debes activar tu cuenta'; } } Reemplazamos por: // CHECAMOS if($data['user_password'] != $pp_password){ return '0: Tu contraseña es incorrecta.'; } else { // LATCH -- OBTENEMOS LATCH ID DE LA BASE DE DATOS POR EL USER NAME DEL FORMULARIO LOGIN $query2 = db_exec(array(__FILE__, __LINE__), 'query', 'SELECT user_latch FROM u_miembros WHERE user_name = \''.$username.'\' LIMIT 1'); $data2 = db_exec('fetch_assoc', $query2); $accountId = $data2['user_latch']; //LATCH -- SI EXISTE LATCH ID CONSULTAMOS EL ESTADO DEL CANDADO if (($accountId != -1) && ($accountId != '')){ $latchapi = new Latch($latchid['appId'], $latchid['secret']); $latchStatusResponse = $latchapi->operationStatus($accountId, $latchid['opLogin']); $statusData = $latchStatusResponse->getData()->operations; $operation = $statusData->{$latchid['opLogin']}; } //LATCH -- SI TENEMOS EL ESTADO DEL CANDADO Y SU ESTADO ES OFF PARAMOS EL LOGIN, SI NO LOGUEMAOS. if (isset($operation) && $operation->status == 'off'){ return '0: Latch bloqueó el acceso'; }else{ if($data['user_activo'] == 1){ // Actualizamos la session $this->session->update($data['user_id'], $remember, TRUE); // Cargamos la información del usuario $this->loadUser(true); // COMPROBAMOS SI TENEMOS QUE ASIGNAR MEDALLAS $this->DarMedalla(); /* REDERIGIR */ if($redirectTo != NULL) $tsCore->redirectTo($redirectTo); // REDIRIGIR else return TRUE; } else return '0: Debes activar tu cuenta'; } } } Si no tuvieramos operaciones habría que reemplazar en el código anterior: $latchStatusResponse = $latchapi->status($accountId, $latchid['opLogin']); por: $latchStatusResponse = $latchapi->status($accountId); y: $operation = $statusData->{$latchid['opLogin']}; por: $operation = $statusData->{$latchid['appId']}; Esto solo sería válido si el login se realiza con el nombre de usuario, si estuviera el mod de login con correo electrónico activado habria que cambiar la consulta, pero no lo miré. Ahora vamos a poner poner otra comprobación al crear un tema nuevo como ejemplo para que podais añadir una operación en donde querais. En c.post.php buscamos: function newPost(){ global $tsCore, $tsUser, $tsMonitor, $tsActividad; Reemplazamos por: function newPost(){ global $tsCore, $tsUser, $tsMonitor, $tsActividad, $latchid; más abajo en la misma función buscamos: // INSERTAMOS $_SERVER['REMOTE_ADDR'] = $_SERVER['X_FORWARDED_FOR'] ? $_SERVER['X_FORWARDED_FOR'] : $_SERVER['REMOTE_ADDR']; if(!filter_var($_SERVER['REMOTE_ADDR'], FILTER_VALIDATE_IP)) { die('0: Su ip no se pudo validar.'); } if(db_exec(array(__FILE__, __LINE__), 'query', 'INSERT INTO `p_posts` (post_user, post_category, post_title, post_body, post_date, post_tags, post_ip, post_private, post_block_comments, post_sponsored, post_sticky, post_smileys, post_visitantes, post_status) VALUES (\''.$tsUser->uid.'\', \''.(int)$postData['category'].'\', \''.$postData['title'].'\', \''.$postData['body'].'\', \''.$postData['date'].'\', \''.$postData['tags'].'\', \''.$_SERVER['REMOTE_ADDR'].'\', \''.(int)$postData['private'].'\', \''.(int)$postData['block_comments'].'\', \''.(int)$postData['sponsored'].'\', \''.(int)$postData['sticky'].'\', \''.(int)$postData['smileys'].'\', \''.(int)$postData['visitantes'].'\', '.(!$tsUser->is_admod && ($tsCore->settings['c_desapprove_post'] == 1 || $tsUser->permisos['gorpap'] == true) ? '\'3\'' : '\'0\'').')')) { $postID = db_exec('insert_id'); // Si está oculto, lo creamos en el historial e.e if(!$tsUser->is_admod && ($tsCore->settings['c_desapprove_post'] == 1 || $tsUser->permisos['gorpap'] == true)) db_exec(array(__FILE__, __LINE__), 'query', 'INSERT INTO `w_historial` (`pofid`, `action`, `type`, `mod`, `reason`, `date`, `mod_ip`) VALUES (\''.(int)$postID.'\', \'3\', \'1\', \''.$tsUser->uid.'\', \'Revisión al publicar\', \''.time().'\', \''.$_SERVER['REMOTE_ADDR'].'\')'); $time = time(); // ESTADÍSTICAS db_exec(array(__FILE__, __LINE__), 'query', 'UPDATE `w_stats` SET `stats_posts` = stats_posts + \'1\' WHERE `stats_no` = \'1\''); // ULTIMO POST db_exec(array(__FILE__, __LINE__), 'query', 'UPDATE u_miembros SET user_lastpost = \''.$time.'\' WHERE user_id = \''.$tsUser->uid.'\''); // AGREGAR AL MONITOR DE LOS USUARIOS QUE ME SIGUEN $tsMonitor->setFollowNotificacion(5, 1, $tsUser->uid, $postID); // REGISTRAR MI ACTIVIDAD $tsActividad->setActividad(1, $postID); // SUBIR DE RANGO? $this->subirRango($tsUser->uid); // return $postID; } else return show_error('Error al ejecutar la consulta de la línea '.__LINE__.' de '.__FILE__.'.', 'db'); y reemplazamos por: // INSERTAMOS $_SERVER['REMOTE_ADDR'] = $_SERVER['X_FORWARDED_FOR'] ? $_SERVER['X_FORWARDED_FOR'] : $_SERVER['REMOTE_ADDR']; if(!filter_var($_SERVER['REMOTE_ADDR'], FILTER_VALIDATE_IP)) { die('0: Su ip no se pudo validar.'); } // LATCH -- OBTENEMOS ID USUARIO $accountId = $tsUser->info['user_latch']; //LATCH -- SI EXISTE LATCH ID CONSULTAMOS EL ESTADO DEL CANDADO if (($accountId != -1) && ($accountId != '')){ $latchapi = new Latch($latchid['appId'], $latchid['secret']); $latchStatusResponse = $latchapi->operationStatus($accountId, $latchid['opCrearpost']); $statusData = $latchStatusResponse->getData()->operations; $operation = $statusData->{$latchid['opCrearpost']}; } //LATCH -- SI TENEMOS EL ESTADO DEL CANDADO Y SU ESTADO ES OFF DEVOLVEMOS MENSAJE DE ERROR, SI NO CREAMOS POST. if (isset($operation) && $operation->status == 'off'){ return 'Latch bloqueó la creación del post'; }else{ if(db_exec(array(__FILE__, __LINE__), 'query', 'INSERT INTO `p_posts` (post_user, post_category, post_title, post_body, post_date, post_tags, post_ip, post_private, post_block_comments, post_sponsored, post_sticky, post_smileys, post_visitantes, post_status) VALUES (\''.$tsUser->uid.'\', \''.(int)$postData['category'].'\', \''.$postData['title'].'\', \''.$postData['body'].'\', \''.$postData['date'].'\', \''.$postData['tags'].'\', \''.$_SERVER['REMOTE_ADDR'].'\', \''.(int)$postData['private'].'\', \''.(int)$postData['block_comments'].'\', \''.(int)$postData['sponsored'].'\', \''.(int)$postData['sticky'].'\', \''.(int)$postData['smileys'].'\', \''.(int)$postData['visitantes'].'\', '.(!$tsUser->is_admod && ($tsCore->settings['c_desapprove_post'] == 1 || $tsUser->permisos['gorpap'] == true) ? '\'3\'' : '\'0\'').')')) { $postID = db_exec('insert_id'); // Si está oculto, lo creamos en el historial e.e if(!$tsUser->is_admod && ($tsCore->settings['c_desapprove_post'] == 1 || $tsUser->permisos['gorpap'] == true)) db_exec(array(__FILE__, __LINE__), 'query', 'INSERT INTO `w_historial` (`pofid`, `action`, `type`, `mod`, `reason`, `date`, `mod_ip`) VALUES (\''.(int)$postID.'\', \'3\', \'1\', \''.$tsUser->uid.'\', \'Revisión al publicar\', \''.time().'\', \''.$_SERVER['REMOTE_ADDR'].'\')'); $time = time(); // ESTADÍSTICAS db_exec(array(__FILE__, __LINE__), 'query', 'UPDATE `w_stats` SET `stats_posts` = stats_posts + \'1\' WHERE `stats_no` = \'1\''); // ULTIMO POST db_exec(array(__FILE__, __LINE__), 'query', 'UPDATE u_miembros SET user_lastpost = \''.$time.'\' WHERE user_id = \''.$tsUser->uid.'\''); // AGREGAR AL MONITOR DE LOS USUARIOS QUE ME SIGUEN $tsMonitor->setFollowNotificacion(5, 1, $tsUser->uid, $postID); // REGISTRAR MI ACTIVIDAD $tsActividad->setActividad(1, $postID); // SUBIR DE RANGO? $this->subirRango($tsUser->uid); // return $postID; } else return show_error('Error al ejecutar la consulta de la línea '.__LINE__.' de '.__FILE__.'.', 'db'); Ahora vamos a crear la opción de pareado y despareado. Decidí ponerla en privacidad por comodidad y hacerla por ajax para retornar con un bonito efecto si el pareado o despareado se realizo correctamente, esto implica modificar un par de archivos más pero vale la pena. En cuenta.php buscamos: } elseif($action == 'save'){ echo $tsCore->setJSON($tsCuenta->savePerfil()); debajo agregamos: } elseif($action == 'parear_latch'){ echo $tsCuenta->parear_latch(); } elseif($action == 'desparear_latch'){ echo $tsCuenta->desparear_latch(); En c.cuenta.php buscamos la funcion yFollow: /* yFollow() */ function yFollow($user_id){ global $tsUser; // YO LE SIGO? $query = db_exec(array(__FILE__, __LINE__), 'query', 'SELECT follow_id FROM u_follows WHERE f_id = \''.(int)$tsUser->uid.'\' AND f_user = \''.(int)$user_id.'\' AND f_type = \'1\' LIMIT 1'); $data = db_exec('num_rows', $query); // return ($data > 0) ? true : false; } y despues agregamos: /* parear latch */ function parear_latch(){ global $tsCore, $tsUser, $latchid; $dato = array( 'codigo' => $tsCore->setSecure($_POST['codigo']), ); // Obligatorio foreach($dato as $key => $val){ $val = trim(preg_replace('/[^ A-Za-z0-9]/', '', $val)); $val = str_replace(' ', '', $val); if(empty($val)) return '2: Completa los campos obligatorios.'; } //get pairing code from user $latchPairingCode = isset($dato['codigo']) ? $dato['codigo'] : ''; //New api instance and pairing $latchapi = new Latch($latchid['appId'], $latchid['secret']); $latchPairResponse = $latchapi->pair($latchPairingCode); $latchResponseData = $latchPairResponse->getData(); $accountId = isset($latchResponseData->accountId) ? $latchResponseData->accountId : ''; //Comprobamos y guardamos id if ($accountId != '' && (db_exec(array(__FILE__, __LINE__), 'query', 'UPDATE u_miembros SET user_latch = \''.$accountId.'\' WHERE user_id = \''.$tsUser->uid.'\''))){ return '1: Pareado correctamente'; }else return '0: Ocurrio un error al parear la cuenta'; } /* Desparear latch */ function desparear_latch(){ global $tsUser, $latchid; $accountId = $tsUser->info['user_latch']; $latchapi = new Latch($latchid['appId'], $latchid['secret']); if (($accountId != -1) && ($accountId != '')){ $unpairResponse = $latchapi->unpair($accountId); $unpairResponseData = $unpairResponse->getData(); if (db_exec(array(__FILE__, __LINE__), 'query', 'UPDATE u_miembros SET user_latch = "" WHERE user_id = \''.$tsUser->uid.'\'')){ return '1: Despareado correctamente';} }else return '0: Ocurrio un problema al desparear la cuenta'; } Ahora vamos a m.cuenta_config.tlp y buscamos: </fieldset> y antes agregamos: <div class="field"> <label>Latch</label> <div class="input-fake"> {if $tsUser->info.user_latch} <div style=" width:310px;"><p>Tu cuenta ahora está pareada con Latch. Si quieres dejar de usar Latch con tu cuenta, haz clic en el botón Desparear Latch.</p></div> <a href="#" class="mBtn btnOk" onclick="latch.desparear(); return false;" title="Desparear latch">Desparear Latch</a> {else} <div style=" width:300px;"><p>Latch es un servicio que te permite agregar un nivel extra de seguridad a tus cuentas y servicios online. Con un solo toque puedes bloquear tus cuentas cuando no las estés utilizando. Para saber más, entra en <a href="https://latch.elevenpaths.com" target="_blank">la web de Latch</a>.</p> <p>Para parear tu cuenta con Latch, descárgate la app de Latch en tu smartphone y sigue las instrucciones. Cuando termines, clica en Parear con latch e introduce el código de pareado.</p> </div> <a href="#" class="mBtn btnOk" onclick="latch.form(); return false;" title="Parear con latch">Parear con latch</a> {/if} </div> </div> Por último en cuenta.js buscamos: /* isImageFile(filename) */ y antes agregamos: var latch = { form: function() { var html = '<input type="text" placeholder="Código de pareado" id="codigo" size="60" class="require" /></br>'; mydialog.class_aux = 'RLatch'; mydialog.mask_close = false; mydialog.close_button = true; mydialog.show(true); mydialog.title('Parear con Latch'); mydialog.body(html); mydialog.buttons(true, true, 'Aceptar', 'latch.verify()', true, true, true, 'Cancelar', 'close', true, false); mydialog.center(); }, verify: function() { var cont = false; $('.require').each(function(){ if($(this).val() == '' || $(this).val() == 0 || $(this).length == 0) { $(this).focus(); cont = false; return false; } else { cont = true; } }); if(cont) latch.parear(); else return false; }, parear: function() { mydialog.procesando_inicio(); var codigo = $('.RLatch #codigo').val(); $.ajax({ type: 'POST', url: global_data.url + '/cuenta.php?action=parear_latch&ajax=true', data: 'codigo='+codigo, success: function(h){ if(h.charAt(0) == '0') { mydialog.alert('Error', h.substring(3)); } else if(h.charAt(0) == '1') { mydialog.alert('Exito', h.substring(3)); } else if(h.charAt(0) == '2') { alert('Completa los datos obligatorios.'); } else { mydialog.alert('Error', h); } mydialog.procesando_fin(); } }); }, desparear: function() { mydialog.procesando_inicio(); var codigo = $('.RLatch #codigo').val(); $.ajax({ type: 'POST', url: global_data.url + '/cuenta.php?action=desparear_latch&ajax=true', data: 'codigo='+codigo, success: function(h){ if(h.charAt(0) == '0') { mydialog.alert('Error', h.substring(3)); } else if(h.charAt(0) == '1') { mydialog.alert('Exito', h.substring(3)); } else { mydialog.alert('Error', h); } mydialog.procesando_fin(); } }); }, } Eso sería todo, debo decir que las cuentas gratuitas de latch community solo permiten hasta un máximo de 50 pareados simultaneos por api, lo que en este tipo de webs es muy poco, si quereis más hay de pagar, sin embargo si eres una pyme española podrás tener Latch de forma totalmente gratuita y con la consola de acceso LST. Aunque no seas pyme y no quieras pagar el uso de Latch podría ser interesante para las cuentas de staff que son las que tienen un control avanzado de la web. Si quereis ponerlo solo para el staff debeis configurar los if para que compruebe que sois admon (administradores o moderadores) en los php y en el tpl para ocultar el formulario de pareado. No hay demo porque las cuentas gratuitas solo permiten 50 usuarios pero hice un video de demostración para que veais el funcionamiento del mod. Eso es todo. Solo me falta dar las gracias al Doctor Chema Alonso, unos de los mayores hacker del mundo por compartir el mod en su blog. Si veis algún error comentarlo y lo solucionaré lo antes posible o si veis alguna forma mejor de implementarlo también sería interesante estudiarla. Espero que os sirva de ayuda. Un saludo.
  25. bug

    Como veo que la sección "Reporte de bugs" no está operativa no tengo claro donde postear este topic, por lo tanto si no es el lugar apropiado pido disculpas. El bug se produce al gestionar las categorías de los post desde la administración. Si accedemos a la sección Categorías y pulsamos en la opción inferior "Mover posts" se nos abre un nuevo panel donde podemos mover los post desde una categoría hacia otra. El fallo ocurre cuando seleccionamos la categoría de origen pero dejamos sin seleccionar la categoría de destino. En ese momento, al pulsar Guardar Cambios, lo que sucede es que TODOS los post de la categoría original se guardan sin categoría asignada creando un pequeño caos y fallos a la hora de localizar los contenidos por categorías, bien sea filtrando desde los TOPs, búsqueda por categorías... etc. Dejo una captura con los pasos para que se pueda comprobar el problema.